C#入门系列 -- 面向对象之多态

举报
陈言必行 发表于 2022/03/19 13:53:31 2022/03/19
【摘要】 基础概念同一操作作用于不同类的实例、不同的类型将进行不同的解释,产生不同的结果,即为多态。C#可以通过继承实现多态性,实现的办法为:对基类的成员进行隐藏或覆盖。 隐藏基类的成员C#规定派生类不能删除它继承的任何成员,但是在派生类中可以隐藏从基类继承的成员,基类的静态成员也可以被派生类隐藏。要隐藏一个基类的成员需做到如下两点:对于数据成员来说,需要声明一个新的相同类型的成员,并使用相同的名称...

基础概念

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

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方法");
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。