public class Bird 
    {
        private string type = "Bird";        public string Type
        {
            get
            {
                return type;
            }
            set
            {
                type = value;
            }
        }        public virtual void ShowType()
        {
            Console.WriteLine("Type is {0}", type);
        }       
    }    public class Chicken : Bird
    {
        private string type = "Chicken";        public override void ShowType()
        {
            Console.WriteLine("Type is {0}", type);
        }
    }    class Program
    {
        static void Main(string[] args)
        {
            Bird bird = new Chicken();
            bird.ShowType();
            Console.WriteLine(bird.Type);
            Console.Read();
        }
    }
为什么bird.ShowType()的输出为Type is Chicken,而Console.WriteLine(bird.Type)的输出为Bird.
请指教

解决方案 »

  1.   

    override 了showType  Chicken里的type值是Chicken   Type取得是Bird里的值  到基类里找
      

  2.   

    本文探讨了new、virtual和override机制,并从相对较底层的原理去解释了程序的运行结果。稍带对比了一下Java里面的运行机制。并且讲述了早绑定和晚绑定概念。这里要提到两个概念:早绑定(early binding)和晚绑定(Late binding)。这个术语出现在存在继承关系的基类和派生类中,它们同时定义了一个同名同参的方法。早绑定:在编译的时候就已经确定了将来程序运行基类或是派生类的哪个方法。在编译代码的时候根据引用类型就决定了运行该引用类型中定义的方法,即基类的方法。这种方法运行效率高。晚绑定:只有在运行的时候才能决定运行基类或者派生类中的哪个方法。运行的时候将根据该实际类型而不是引用类型来调用相关方法,即取决于我们new了什么样对象。也就是即使我们new一个Father类的子类Son的实例,而不管我们是用Father类的引用指向这个Son的实例,方法调用的时候依然是调用Son的方法,而不是Father类的同名方法。
    http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx
      

  3.   

     public override void ShowType() 
            { 
                Console.WriteLine("Type is {0}", type); 
            } Chicken重写了 SHowType方法
     type为本类中的type=“Chicken”bird 为Bird 的对象 
    在new Chicken(); 类中创建bird.Type 为基类属性未重写
      

  4.   

    bird.ShowType()的输出为Type is Chicken,因为子类重新定义了type的变量,
    Console.WriteLine(bird.Type)的输出为Bird,因为调用的是父类的函数ShowType
      

  5.   

    ShowType(); 里就输出一个type = "Chicken"的字符串,当然是Type is Chicken
    bird.Type,这里Type是他的属性private string type = "Bird";这里定义的,当然是输出Bird
      

  6.   

    Bird bird = new Chicken(); 
    楼主的这个bird应该是上转型对象,其具有以下特征。1)上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能使用子类新增的方法(失掉了一些功能).
    2)上转型对象可以操作子类继承或隐藏的成员变量,也可以使用子类继承的或重写的方法.
    3)上转型对象操作子类继承或重写的方法时,就时通知对应的子类对象去调用这些方法.因此,如果子类重写了父类的某个方法后,对象的上转型对象调用这个方法时,一定是调用了这个重写的方法.
    4)可以讲对象的上转型对象再强制转换到一个子类的对象,这时,该子类对象又具备了子类的所有属性和功能.第一个问题可以由上转型的第三个特征来描述 所以输出应该是覆盖后的方法第二个问题可以这样解释 上转型bird.type 调用了它的属性这时因该找到的是它的属性type并不是字段type                    所以要调用属性type的get方法,而只有调用基类的方法了