有一个疑惑如下:
using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApplication1
{
    class Program
    {
        public abstract class animal
        {
            public abstract void Eat();
        }        public class bird : animal
        {
            private string type;
            public bird()
            {
                Type="bird";
            }
            public string Type
            {
                get
                { 
                    return type;
                }
                set
                {
                    type = value;
                }
            }
            public override void Eat()
            {
                
                Console.WriteLine("Bira is eating!");
            }
        }
        public class chichen : bird
        {
            private string type;            public string Type
            {
                get
                { 
                    return type;
                }
                set
                {
                    type = value;
                }
            }
            public chichen()
            {
                Type = "chichen";
            }
            public override void Eat()
            {
                Console.WriteLine("Chichen is eating!");
            }
        }        static void Main(string[] args)
        {
            bird app = new chichen();
            Console.WriteLine("aap's Type is {0}.",app.Type);
            app.Eat();
            Console.ReadKey();
        }
    }
}
上述代码输入app.Type输出是bird;
但是把红色代码去掉后app.Type输出是chichen,请大侠们帮忙解释下。

解决方案 »

  1.   

    如果没有红色那段代码,chichen也会冲bird类继承type 和 Type啊,继承之后的type也应该是chichen??
      

  2.   

    你的构造函数的问题
    他说先执行基类的构造函数,再执行派生类的构造函数
    所以会有这样的结果如果你加上了红色的区域之后
    那么Type就默认为派生类中的属性字段了
      

  3.   

    LZ有没发现这段代码编译能通过但是会报错:E:\C#\Demo>csc 20090116b.cs
    Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42
    for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
    Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.20090116b.cs(51,27): warning CS0108: 'test.chichen.Type' hides inherited member
            'test.bird.Type'. Use the new keyword if hiding was intended.
    20090116b.cs(27,27): (Location of symbol related to previous warning)

    E:\C#\Demo>20090116b
    aap's Type is bird.
    Chichen is eating!
    请按任意键继续. . .红色部分说的是子类中的字段属性与父类中的重名了你把chichen类中的Type属性改成Type1试试...
      

  4.   

    你把chichen实例化成bird类型~那bird的type就是Bird哇~
      

  5.   

    不是的,你輸出的結果是正常的
    你的children 隱掉了父類的Type,但你在創建子類對象時,又把它轉換成父類對象,輸出的當然是父類如果子類時重寫父類的,那么在轉換為父類時,會先找子類有沒有重寫Type,有就輸出子類,沒有就輸出父類你目前的這種做法,其實就是用new 与 override 的區別
      

  6.   

    bird app = new chichen(); //当执行这一句时,会先调用Bird()的构造函数,这时Type被赋值为"bird",然后再调用chichen()的构造函数,Type又被赋值为"chichen"如果想要达到你的效果,构造函数中的Type写为"type"就可以了