new、virtual、override、abstract 等-隐藏与覆盖实际操作

作者:vkvi 来源:千一网络(原创) 日期:2019-3-20

本文主要用实际讲解下 new、override 的隐藏、覆盖

如果父类有一个方法,派生类也有这个方法,我们讨论以下四种情况:

1、父类方法无修饰符,派生类方法也无修饰符。

2、父类方法无修饰符,派生类方法 new 修饰符。

3、父类方法 virtual 修饰符,派生类方法 new  修饰符。

4、父类方法 virtual 修饰符,派生类方法 override 修饰符。

前三个其实效果都是一样的,是隐藏。不过第一个会有警告,Visual Studio 会提示你是不是搞忘了加 new。

最后一个是覆盖

再看示例,并看看方法嵌套的情况。

上述代码的结果是 12,因为 B 覆盖了,所以调用 B 总是调用派生类的,B 中调用的 A,也是优先在自己的类中找,所以尽管 B 仅仅是隐藏,仍然是在派生类中找。

上述代码的结果是 1b,因为 B 仅仅是隐藏,所以调用的还是 C 中的 B,而 B 调用的 A,由于 A 被覆盖,所以是派生类的 A。

总结一下:

将派生类对象赋给基类时,调用其方法时:

  • 如果方法被隐藏,则调用的是基类的。
  • 如果方法被覆盖,则调用的是派生类的。
  • 如果是间接调用(比如上面的 B 调用 A),则是站在调用者的角度来处理。
  • 如果有多重继承,也是类似的道理,覆盖的方法总是向派生类靠拢,隐藏的方法总是向基类靠拢。

还没完

如果派生类里面要强制访问父类的方法怎么办呢?

使用 base,比如:base.F1();

如果孙子类里面要强制访问爷爷的方法怎么办呢?

除非爸爸没有拦截(不管是 new 还是 override),也就是说除非爸爸没有隐藏、覆盖爷爷的方法,否则孙子没办法直接访问爷爷的方法,base 对应的是爸爸的。

相关阅读

你前面那位网友看了:Process Monitor

▲▲▲嘿,欢迎转载传播本站原创文章,尽量保留来源噢。▲▲▲

文章评论
标题:必填
内容:
本站永远终止与捏造“罪名”不支付广告费的某度联盟合作。
vkvi
vkvi

作者简介: vkvi,致力于 .NET Web 开发、移动开发的技术推广,在 .NET、SQL Server、Windows Server 等方面有深入研究和丰富经验,10 年间共计撰写文章 4000 余篇。 主持金融、国土、农业、电商等多个行业项目执行, 推行“技术提升生产力、人心决定成功率”的管理理论。 联系他