文章目录
- 多态的概念
- 多态的实现
- 方法重载、重写、隐藏
- 重载
- 重写
- 隐藏
|
多态的概念
什么是多态?
多态一次最早用于生物学,指同一种族的生物具有不同的特性。比如青蛙小时候是蝌蚪,长大了是青蛙,同是一种生物但是有不同的表现形式。
在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
- 帮忙点个赞吧。哈哈。