首页新闻找找看学习计划

c# 类继承 重载

0
悬赏园豆:10 [已解决问题] 解决于 2015-07-01 16:30

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(); } }

就这段代码,我知道输出是什么,但是不是很理解为什么,能不能给讲下原因啊?

c#
问题补充:

PA san=new PA();

 

和上面两个实例, 他们三个有什么区别?

 

还有能不能 写PB si=new PA();

..00..的主页 ..00.. | 初学一级 | 园豆:49
提问于:2015-06-30 16:12
< >
分享
最佳答案
0

都是从当前的继承层次去找这个属性的实现,但是标记为override和new不同

1. 标记为override时:当使用对象的基类部分的引用(这里的one)调用一个覆写(override)的属性(这里的PA)时,属性的调用被沿派生层次上溯(MyA->DV)执行,一直到标记为override的属性的最派生(most-derived)版本(这里的DV里的PA实现)。

2. 标记为new时:是隐藏一个继承的数据成员(PB),其实有点“我跟基类里的那个方法没什么继承的关系了,我其实仅仅是把名字(或者说方法签名)抢着用了”,既然没关系自然不用上溯查找了。

好吧,可能也没说清楚,这表达能力。。。

楼主还是找本书看看吧。

收获园豆:4
liqipeng | 小虾三级 |园豆:1160 | 2015-07-01 02:59
其他回答(3)
0

你按着单步执行不就可以看出来了?

收获园豆:2
爱编程的大叔 | 园豆:30089 (高人七级) | 2015-06-30 16:21
0

这个是基础语法问题,你买本C#教科书,里面都会有,

new出1个对象,如果对象成员是override的,用基类引用和子类引用的效果是一样,都调用子类成员

如果子类成员是new的用子类引用调用时调用的子类成员,用基类引用调用时,调用基类成员。

收获园豆:2
吴瑞祥 | 园豆:28743 (高人七级) | 2015-06-30 16:41
0

主要就是那几个关键字,virtual、override 、类DV的new

你可以试试删除关键字是什么结果

调试的时候F11,逐步跟踪

收获园豆:2
ExploreForward | 园豆:18 (初学一级) | 2015-06-30 18:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册