virtual、override-蝌蚪和青蛙-C#多态

  • 博主写作不容易,孩子需要您鼓励
  • 万水千山总是情 , 先点个赞行不行

多态的概念

什么是多态?
多态一次最早用于生物学,指同一种族的生物具有不同的特性。比如青蛙小时候是蝌蚪,长大了是青蛙,同是一种生物但是有不同的表现形式。
在C#中多态的定义是:同一操作作用于不同类的对象,不同的类的对象进行不同的执行,最后产生不同的执行结果。如所有的动物都有吃东西这一功能,但是羊吃草,狮子吃肉,每种动物都有自己的吃食方式。
重载是多态的一种。

多态的实现

C#中支持基于接口的多态和基于继承的多态,基于继承的多态设计在基类中定义方法,并在派生类中重写方法。多态和重写是紧密联系的,重写是实现多态的重要手段。重写基类方法就是修改它的实现,或者说在派生类中对继承的基类方法重新编写。在基类中用virtual关键字声明的方法在派生类中可以重写。

  • 虚函数定义语法格式如下:
  • <访问修饰符> virtual 返回类型 方法名()
        {
                //方法主体
        }
    

    在派生类中使用override关键字来声明重写,以实现对基类中的虚拟方法修改或重新编写。如在上一篇文章中基类Person类中声明一个display方法,用于显示姓名、年龄和性别等信息。

    public void DisPlay()           //基类共用方法,显示人的信息
            {
                Console.WriteLine("{0}是{1}性,年龄为{2}岁",this._name,this._gender,this._age);
            }
    

    person的派生类student和teacher调用display时都会显示姓名、性别、年龄信息,要想使显示学生的信息和显示老师的信息不一样,就需要使用virtual关键字把基类中的display方法定义成虚函数,使用override关键字在派生类重写display方法。
    代码如下:

    public virtual void DisPlay()           //基类定义虚函数方法,显示人的信息
            {
                Console.WriteLine("{0}是{1}性,年龄为{2}岁",this._name,this._gender,this._age);
            }
    

    在派生类student中重写基类的虚函数,使用override关键字,代码如下:

    public override void DisPlay()           //重写基类虚函数
            {
            	Console.WriteLine("这是学生");
                base.DisPlay();
            }
    

    在派生类teacher中重写基类的虚函数,使用override关键字,代码如下:

    public override void DisPlay()           //重写基类虚函数
            {
            	Console.WriteLine("这是老师");
                base.DisPlay();
            }
    

    重写时,子类重写方法的访问级别和父类虚拟方法的访问级别必须相同。如上代码,父类方法是public,子类也必须是public。

    方法重载、重写、隐藏

    重载

    重载是在同一个作用域内发生,定义一系列同名方法,但是方法的参数列表不同,就是签名不同,签名由方法名和参数组成。能通过传递不同的参数来决定到底调用哪一个同名方法。注意返回值类型不同不能构成重载,因为签名不包括返回值。

    重写

    基类方法中使用virtual关键字声明方法和派生类中使用override关键字声明的方法名称相同,参数列表也相同,就是基类的方法和派生类方法相同,实现了派生类重写基类中的同名方法。

    隐藏

    基类中的方法不声明为virtual,在派生类中声明与基类重名时,需要使用new关键字,以隐藏基类同名方法。
    如在person类中声明两个display方法用于显示person的信息演示重载,在其派生类中实现display重写和隐藏的代码如下:

    public virtual void DisPlay()           //基类定义虚函数方法,显示人的信息
            {
                Console.WriteLine("{0}是{1}性,年龄为{2}岁",this._name,this._gender,this._age);
            }
    public virtual void DisPlay(string id)           //同名方法实现重载
            {
            	this.DisPlay();
                Console.WriteLine("身份证号是:{0},id);
            }
    

    在派生类student类中声明如下方法使用隐藏:

    public override void DisPlay()           //重写基类虚函数
            {
            	Console.WriteLine("这是学生");
                base.DisPlay();
            }
    public new void DisPlay(string no)           //使用new隐藏基类
            {
            	Console.WriteLine("这是学生");
                base.DisPlay();
                Console.WriteLine("学生学号是:{0},no);
            }      
    
    ------------------------------------------------------------------------------------------
                                                  分割线
    ------------------------------------------------------------------------------------------
    
    • 博主简介:
    • 工业自动化上位机软件工程师、机器视觉算法工程师、运动控制算法工程师。目前从业于智能制造自动化行业。 博主邮箱:2296776525@qq.com
    • 帮忙点个赞吧。哈哈。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值