遥不可及|C#中子类对基类方法的继承、重写和隐藏
提起子类、基类和方法继承这些概念 , 肯定大家都非常熟悉 。 毕竟 , 作为一门支持OOP的语言 , 掌握子类、基类是学习C#的基础 。 不过 , 这些概念虽然简单 , 但是也有一些初学者可能会遇到的坑 , 我们一起看看吧 。
子类继承基类非私有方法首先我们看最简单的一种 , 子类继承自基类 , 但子类对继承的方法没有任何改动
class Person{public void Greeting(){Console.WriteLine("Hello, I am Person");}}class Employee : Person{}class Program{static void Main(string[] args){Person p = new Employee();p.Greeting();}}在这个例子中 , 作为子类的Employee自动继承了基类的 Greeting 方法 , 当在子类实例调用这个方法的时候 , 实际上调用的是基类的方法 。 这个例子非常简单 , 毋庸多言 。
子类覆盖基类方法接着是最常见的情况 , 子类覆盖基类的方法 , 典型的例子如下
class Person{public virtual void Greeting(){Console.WriteLine("Hello, I am Person");}}class Employee : Person{public override void Greeting(){Console.WriteLine("Hello, I am Employee");}}class Program{ static void Main(string[] args) {Employee e = new Employee();Person p = e;p.Greeting();e.Greeting(); }}【遥不可及|C#中子类对基类方法的继承、重写和隐藏】同样 , 这段代码也很简单 , 基类方法通过关键字 virtual 表明方法可以被覆盖 , 子类通过关键字 override 实现对基类方法的覆盖 , 最后看调用部分 , 无论变量类型是子类还是基类 , 只要对象实际类型是子类 , 调用的方法都是子类覆盖的方法 , 这也是多态的实现基础 。
子类隐藏基类方法上面两个例子都非常简单 , 逻辑也很清楚 , 有点绕的要算子类隐藏基类方法的情况 。
子类隐藏基类的非虚方法基类被子类继承的方法可能是虚方法 , 也可能是非虚方法 , 先看非虚方法被子类隐藏的情况 , 隐藏基类方法使用的关键字是 new
class Person{public void Greeting(){Console.WriteLine("Hello, I am Person");}}class Employee : Person{public new void Greeting(){Console.WriteLine("Hello, I am Employee");}}class Program{static void Main(string[] args){Employee e = new Employee();Person p = e;p.Greeting();e.Greeting();}}这里的结果可能就出乎某些初学者的意料了 , 为什么明明是子类 Employee 的实例 , 却在不同的引用变量类型下呈现出了不一样的效果?为什么会调用到了基类里面的方法?
其实这跟C#的函数调用机制有关 , 一般来说 , C#编译成MSIL之后 , 有两种函数调用方式 。
- Call 以非虚的方式调用方法 , 一般用于静态函数调用 , 因为静态函数不可能是虚的 , 但也可以以非虚的方式调用一个虚方法
- Callvirt 以虚方式调用 , 一般用于非静态方法和虚方法的调用 。 如果调用的方法非虚 , 则引用变量类型决定了最终调用的方法;反之 , 如果调用的方法为虚 , 则实例变量类型决定最终调用的方法——因为可能出现方法重写 , 即 , 多态
推荐阅读
- 遥不可及|DataForce组件技术及功能:数据批量和实时同步
- 遥不可及|100万美元!辽宁副省长卢柯拿下科学大奖 埋头多年攻坚新型纳米结构研究
- 遥不可及|联发科取消为华为定制5nm芯片计划,希望9月15号后继续供货
- 猪奇游戏菌|王者荣耀:职业真的遥不可及?老帅和末将的成功,告诉你并不绝对!
- 遥不可及|两年前的华为神机!2020年的华为P20Pro一切都还好吗?
- 遥不可及|英伟达显卡发展简史(一)
- 塞巴斯蒂安·维特尔|每站都在创造“新历史”!36年来首次!前10对跃马来说已是遥不可及的梦
- 遥不可及|与他人进行远程控制电脑能看见啥
- 遥不可及|8月最流畅安卓机型排行,小米一跃成王,诺基亚也上榜
- 遥不可及|20家跨国公司代表东湖绿道健康跑,这位选手用“5G速度”第一个冲线
