写点什么

C#入门系列 (二十二) -- 面向对象之多态

作者:陈言必行
  • 2022 年 7 月 17 日
  • 本文字数:1434 字

    阅读完需:约 5 分钟

基础概念

同一操作作用于不同类的实例、不同的类型将进行不同的解释,产生不同的结果,即为多态。


C#可以通过继承实现多态性,实现的办法为:对基类的成员进行隐藏或覆盖。



隐藏基类的成员

C#规定派生类不能删除它继承的任何成员,但是在派生类中可以隐藏从基类继承的成员,基类的静态成员也可以被派生类隐藏。


要隐藏一个基类的成员需做到如下两点:


  1. 对于数据成员来说,需要声明一个新的相同类型的成员,并使用相同的名称;对于函数成员来说,需要声明新的带有相同签名的函数成员;

  2. 在派生类中声明用来隐藏基类成员的同名成员时需要使用 new 修饰符。


代码示例:


public void Show(){    Console.WriteLine("基类 Show");}
复制代码


则在派生类 Cat 中定义隐藏方法的代码为:


new public void Show(){    Console.WriteLine("派生类 Show");}
复制代码



覆盖基类的成员

如果有一个派生类对象的引用,使用类型转换运算符把该引用转换成基类类型,就可以获取该对象基类部分的引用,


格式如下所示:


(基类名) 派生类对象名;
复制代码


将派生类对象的引用转换成基类引用来访问派生类对象时,得到的是基类的成员。


虚方法提供了使基类引用访问“升至”派生类内的方法。虚方法即为使用关键字 virtual 声明的实例方法;没有使用关键字 virtual 声明的方法称为非虚方法。


借助虚方法使得基类引用调用派生类的方法需要满足下列条件:


  1. 派生类的方法和基类的方法具有相同的方法签名和返回类型;

  2. 基类的方法必须使用 virtual 声明为虚方法;

  3. 派生类的方法需要使用 override 标注为覆写方法。


使用虚方法和覆写方法时还需注意:


  1. 虚方法和覆写方法必须具有相同的可访问性;

  2. 不能覆写静态方法和非虚方法;

  3. 方法、属性、索引以及事件都可以使用 virtual 和 override 进行声明和覆写;

  4. 覆写方法可以出现在继承的任意层次上。



virtual 和 abstract

virtual 和 abstract 都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。


  1. virtual 修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而 abstract 修饰的方法一定不能实现。

  2. virtual 可以被子类重写,而 abstract 必须被子类重写。

  3. 如果类成员被 abstract 修饰,则该类前必须添加 abstract,因为只有抽象类才可以有抽象方法。

  4. 无法创建 abstract 类的实例,只能被继承无法实例化。


重载和重写:


  • 重载(overload)是提供了一种机制, 相同函数名通过不同的返回值类型以及参数来表来区分的机制。

  • 重写(override):是用于重写基类的虚方法,这样在派生类中提供一个新的方法。



多态代码示例

class Program{    static void Main(string[] args)    {        // 多态的实现前提是继承和方法重写,基类可以new所有的派生类        // new哪个类 他就执行那个类的方法
// 实例Person类 Person person = new Person(); // 实例Student类 Person student = new Student(); // 实例Teacher类 Person teacher = new Teacher();
person.Show(); // 调用Person类的Show方法 student.Show(); // 实例Student类 teacher.Show(); // 实例Teacher类
Console.ReadLine(); }}
class Person{ public virtual void Show() { Console.WriteLine("这是Person的Show方法"); }}
class Student : Person{ public override void Show() { Console.WriteLine("这是Student的Show方法"); }}
class Teacher : Person{ public override void Show() { Console.WriteLine("这是Teacher的Show方法"); }}
复制代码


发布于: 刚刚阅读数: 3
用户头像

陈言必行

关注

公号:开发同学留步 2019.03.12 加入

我是一个从事Unity游戏开发攻城狮,6年开发经验,助你日常不加班。

评论

发布
暂无评论
C#入门系列(二十二) -- 面向对象之多态_七月月更_陈言必行_InfoQ写作社区