class MyA { public virtual string PA { get { return "MyA PA"; } } public string PB { get { return "MyA PA"; } } } class DV: MyA { public override string PA { get { return "DV PA"; } } public new string PB { get { return "DV PB"; } } } class Program { [STAThread] static void Main(string[] args) { MyA one = new DV(); DV two = new DV(); Console.WriteLine("{0}\n{1}\n{2}\n{3}",one.PA,one.PB,two.PA,two.PB); Console.WriteLine(); } }
就这段代码,我知道输出是什么,但是不是很理解为什么,能不能给讲下原因啊?
PA san=new PA();
和上面两个实例, 他们三个有什么区别?
还有能不能 写PB si=new PA();
都是从当前的继承层次去找这个属性的实现,但是标记为override和new不同
1. 标记为override时:当使用对象的基类部分的引用(这里的one)调用一个覆写(override)的属性(这里的PA)时,属性的调用被沿派生层次上溯(MyA->DV)执行,一直到标记为override的属性的最派生(most-derived)版本(这里的DV里的PA实现)。
2. 标记为new时:是隐藏一个继承的数据成员(PB),其实有点“我跟基类里的那个方法没什么继承的关系了,我其实仅仅是把名字(或者说方法签名)抢着用了”,既然没关系自然不用上溯查找了。
好吧,可能也没说清楚,这表达能力。。。
楼主还是找本书看看吧。
你按着单步执行不就可以看出来了?
这个是基础语法问题,你买本C#教科书,里面都会有,
new出1个对象,如果对象成员是override的,用基类引用和子类引用的效果是一样,都调用子类成员
如果子类成员是new的用子类引用调用时调用的子类成员,用基类引用调用时,调用基类成员。
主要就是那几个关键字,virtual、override 、类DV的new
你可以试试删除关键字是什么结果
调试的时候F11,逐步跟踪