遥不可及|C#中子类对基类方法的继承、重写和隐藏( 二 )
子类隐藏基类的虚方法考虑下面的代码
class Person{public virtual void Greeting(){Console.WriteLine("Hello, I am Person");}}class Employee : Person{public new virtual void Greeting(){Console.WriteLine("Hello, I am Employee");}}class Manager : Employee{public override void Greeting(){Console.WriteLine("Hello, I am Manager");}}class Program{static void Main(string[] args){Manager m = new Manager();Person p = m;Employee e = m;p.Greeting();e.Greeting();m.Greeting();}}猜一下输出应该是什么?这也是老胡曾经遇到过的一道笔试题 , 表面看着简单 , 但是不注意也会掉坑里
1 , 2 , 3 , 答案揭晓
是不是有点出乎意料呢 , 让我们来分析一下
首先 , 三次调用均是callvirt , 而且方法 Greeting 是虚方法 , 我们需要考虑对象实例以决定要调用的方法 。
- 在第一次调用中 , 引用变量类型是Person , 虽然对象实例类型Manger重写了Greeting方法 , 但是它重写的是继承自Manger基类Emplyee的Greeting方法 , Person中Greeting方法在子类Manger中仅仅是被隐藏而没有被重写 , 所以这里调用的是Person中的Greeting
- 而第二次调用中 , 引用变量类型是Employee , Employee的Greeting方法被Manager重写 , 所以这次调用到的是Manager中的Greeting
- 最后一次调用毋庸多言 , 简单的重写案例而已
总结在子类对基类有方法继承、重写和隐藏的情况下 , 有时候判断具体哪个方法被调用会有难度 , 但请记住以下要点:
- 如果被调用方法非虚 , 那么只用关注引用变量类型就好 , 引用变量类型能决定调用方法在哪里
- 如果调用方法为虚 , 我们需要站在引用变量类型的角度 , 审视该方法是否被对象类型所重写;若是 , 则调用对象类型的重写方法;反之 , 则再次让引用变量类型决定调用方法 。
原文作者:老胡写代码
原文地址:
推荐阅读
- 遥不可及|DataForce组件技术及功能:数据批量和实时同步
- 遥不可及|100万美元!辽宁副省长卢柯拿下科学大奖 埋头多年攻坚新型纳米结构研究
- 遥不可及|联发科取消为华为定制5nm芯片计划,希望9月15号后继续供货
- 猪奇游戏菌|王者荣耀:职业真的遥不可及?老帅和末将的成功,告诉你并不绝对!
- 遥不可及|两年前的华为神机!2020年的华为P20Pro一切都还好吗?
- 遥不可及|英伟达显卡发展简史(一)
- 塞巴斯蒂安·维特尔|每站都在创造“新历史”!36年来首次!前10对跃马来说已是遥不可及的梦
- 遥不可及|与他人进行远程控制电脑能看见啥
- 遥不可及|8月最流畅安卓机型排行,小米一跃成王,诺基亚也上榜
- 遥不可及|20家跨国公司代表东湖绿道健康跑,这位选手用“5G速度”第一个冲线
