public class A 
    {
     public void DoSomething()
        {
          System.Console.WriteLine("A.Dosomething");
        }
  }
public class B:A 
    {
      public  void DoSomethingElse()
       {
         System.Console.WriteLine("B.DosomethingELSE");
       }
      public new void DoSomething()
       {
         System.Console.WriteLine("B.Dosomething");
       }
  }
public class EntryPoint
{
   static void Main()
     {
       B b=new B();
       b.DoSomething();b.DoSomethingElse();
       A a=b;//这儿有点不明白,实例化A又让它等于b干什么?
       a.DoSomething();
}}

解决方案 »

  1.   

    A a=b;//这儿有点不明白,实例化A又让它等于b干什么?
    这个是定义一个类型为A 的小a变量,比如说A为中国,B就是广西,那你就可以把广西说成中国.
      

  2.   

    b派生于a,相当于b是麻雀,a是鸟让 可以保存鸟的变量等于麻雀,这完全可以,但麻雀自己独有的属性方法是无法通过鸟这个变量来访问了,只能访问公共的鸟这个类型具有的变量和方法。虽然不能直接访问独有的属性方法,但是面向对象的多态特性显露出优势来了,比如每种鸟有不同的飞行方法,你有麻雀,有大雁,有猫头鹰,那就要一个个的写了
    麻雀.飞
    大雁.飞
    猫头鹰.飞。
    但如果在鸟类型上定义一个虚方法 .飞
    每种具体的鸟自己重写飞的实现。
    就可以通过循环来写了
    鸟[] bird= new 鸟[] { 麻雀,大雁,猫头鹰};
    foreach (int b in bird)
    {
        b.飞
    }
      

  3.   

    官方说法
    a是基类,
    b是a的派生类
      

  4.   

     B b=new B();
      b.DoSomething();b.DoSomethingElse();
      A a=b;//这儿有点不明白,实例化A又让它等于b干什么?基类引用可以指向派生类的实例
      

  5.   

    a倒底是实例化A了还是是B呢?从结果看是A,那么等于b 也就没有什么意义了?画蛇添足吗?
      

  6.   


    我想问一下,这样理解对不对:
    如果有个鸟没有自己的飞的话,就会直接引用公共的基类?foreach循环就能直接循环下去
    麻雀.私有飞
    大雁.公共飞
    猫头鹰.私有飞如果没有这样机制的话,就要一个一个的进行付值或者定义,会比较麻烦一些?这样理解对不对?
      

  7.   

    因为都是一类的,所以可以赋值。B也是A类型,更深入的理解请参考对象模型 http://www.cnblogs.com/xujiaci/archive/2007/11/02/946650.html。
      

  8.   

     A a=b;让 a 实际上具有了b的所有成员值,但是在执行方法DoSomething的时候又保留了自己的实现(就是还是调用a自己的DoSomething方法)
      

  9.   

    这是一个oop中基类与派生类的问题,实例化一个类,等号左右的不一定是同一个类,可以是基类引用=派生类实例
      

  10.   


    可以执行 b的  DoSomethingElse()
    又可以执行 a的DoSomething()
      

  11.   

    这里需要用到装箱和摘箱来解释,就像C#中所有的类都继承于object类一样,object是派生类的基类,派生类的实例对象就可以通过摘箱的方式转换为基类的对象实例,而基类的实例对象也可以通过装箱的方式转换为其派生类的实例对象,装箱和摘箱可以是显示进行,也可以是隐示进行的,如在C#中有一个int类型变量number和一个string类型变量str,我们通常是这样写的str=number.Tostring(),其实这条语气就要经过一次摘箱和一次装箱,首先是number从int类型变为object类型,这要经过摘箱,然后由object转变为string类型是要经过装箱的。就像你的B类继承了A类一样,B类的实例可以摘箱变为A类的实例,而A类的实例可以通过装箱的方式变为B类实例。
      

  12.   


    你可以把代码复制一下试试,如果我这样写:A a=b;
    执行 a.dosomething()  显示:"A.Dosomething"
    写 a.elsedosomething() 则编译就会出错!这样说,一个基类不能直接使用用他子类的方法、属性我现在想不出这样付值来做有什么好处来了!
      

  13.   

    直接调用当然会出错,但是间接调用
    1  (a as b).elsedosomething() 
    2 反射好处当然是有的,但说开来就大了
      

  14.   

      B b=new B();
      b.DoSomething();
      b.DoSomethingElse();
      A a=b;//这儿有点不明白,实例化A又让它等于b干什么?
      a.DoSomething();这个等同于
      B b=new B();
      b.DoSomething();
      b.DoSomethingElse();
      A a=new B();
      a.DoSomething();这应该是多态的一种应用吧。