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.
请指教
http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx
{
Console.WriteLine("Type is {0}", type);
} Chicken重写了 SHowType方法
type为本类中的type=“Chicken”bird 为Bird 的对象
在new Chicken(); 类中创建bird.Type 为基类属性未重写
Console.WriteLine(bird.Type)的输出为Bird,因为调用的是父类的函数ShowType
bird.Type,这里Type是他的属性private string type = "Bird";这里定义的,当然是输出Bird
楼主的这个bird应该是上转型对象,其具有以下特征。1)上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能使用子类新增的方法(失掉了一些功能).
2)上转型对象可以操作子类继承或隐藏的成员变量,也可以使用子类继承的或重写的方法.
3)上转型对象操作子类继承或重写的方法时,就时通知对应的子类对象去调用这些方法.因此,如果子类重写了父类的某个方法后,对象的上转型对象调用这个方法时,一定是调用了这个重写的方法.
4)可以讲对象的上转型对象再强制转换到一个子类的对象,这时,该子类对象又具备了子类的所有属性和功能.第一个问题可以由上转型的第三个特征来描述 所以输出应该是覆盖后的方法第二个问题可以这样解释 上转型bird.type 调用了它的属性这时因该找到的是它的属性type并不是字段type 所以要调用属性type的get方法,而只有调用基类的方法了