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
- 帮忙点个赞吧。哈哈。
virtual、override-蝌蚪和青蛙-C#多态相关推荐
- C# 用装饰模式实现蝌蚪变青蛙的过程
在面向对象的理论中,始终强调是抽象与组合以及一些其他面向对象的机制比如继承,封装和多态. 前面的文章都将有抽象是什么,至于抽象如何使用,就是把实现往上总结共性而去除特性,由此得到抽象层次和实现层次,所 ...
- 谈谈C#中的三个关键词new , virtual , override(装载 Winner.Net)
C#支持单继承,说到继承就不得不说new,virtual和override这三个关键词,灵活正确的使用这三个关键词,可以使程序结构更加清晰,代码重用性更高. 以下是msdn中对new,virtual和 ...
- 蝌蚪与青蛙是同一个物种么?
最近在一本书上看到, 说蝌蚪的腿要是被砍了, 很快就可以在长出来, 而等他长成了青蛙, 却失去了这种能力. 于是我想, 为什么蝌蚪长成青蛙后, 就失去了这种能力呢? 是它在成长过程中的演变吗? 成年后 ...
- 谈谈C#中的三个关键词new , virtual , override
谈谈C#中的三个关键词new , virtual , override C#支持单继承,说到继承就不得不说new,virtual和override这三个关键词,灵活正确的使用这三个关键词,可以使程序结 ...
- new,virtual,override,interface,delegate,event-------------C#——方法实现总结
C#--方法实现总结 本文分两部分来写,第一部分:C#方法实现的理解与问题,第二部分:C#中方法实现的种类. 第一部分:C#方法实现的理解与问题 理解: 1. 使用virtual和override关键 ...
- c#中的interface abstract virtual override和new
from:(http://hi.baidu.com/21tian/blog/item/aabfae6ed4a675de81cb4ab4.html) interface用来声明接口 1.只提供方法的规则 ...
- C#语言使用多态(接口与override) ——帮您剔除对面向对象多态性的疑惑
多态是面向对象编程中三大机制之一,其原理建立在"从父类继承而来的子类可以转换为其父类"这个规则之上,换句话说,能用父类的地方,就能用该类的子类.当从父类派生了很多子类时,由于每个子 ...
- C# 子类实例化基类 基类使用不了子类的方法_C#学习笔记09--构造方法/析构方法/继承/多态/封装...
一.构造方法 当创建一个类时, 系统会自动创建一个默认的无参构造方法, 这个方法和类同名, 在创建对象的时候自动调用. 默认的构造方法里面什么也没有, 重写之后就可以在创建对象的时候同时搞点事情了. ...
- java 计算器类图_多态计算器(封装、继承、多态、简单工厂)
一.封装 向对象程序设计中,一个非常重要的技术便是封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.这样做的好处在于可以使类内部的具体 ...
最新文章
- 记录SpringBoot集成Shiro使用Redis作缓存遇到的一个问题(Key-Value)互换
- 前端面试常见HTML问题(一)
- linux时间修改-hwclock和date
- Spring的@Transactional注解踩坑
- 拿专属内推码!一汽-大众专场直播招聘来了
- rsa 返回值 验签 失败_解析蛋糕、面包制作失败的原因
- 《精通javascript》几个简单的函数(二)
- dockerfile中的env指令_Dockerfile中的ENV指令的具体使用详解
- BP神经网络预测(python)
- Echarts 实现 设备运行状态图 工业大数据展示
- ubuntu 16.04 deepin.com.wechat 微信登录提示版本过低解决方案
- 在windows 10下编译可在windows xp下使用的 opencv 3.2
- ev6 ev8 ev4a加密视频破解翻录提取教程
- 今天没有穿内裤._今天...
- 抖音3d相册html代码,抖音3D立体相册表白代码.doc
- 微信公众号订阅号申请注册教程
- 黄石城市职业学院计算机专业,黄石6所中职学校 14个“3+2”专业直升大学
- python getter setter_python的getter和setter方法使用详解
- 基于HANA数据库的BW4HANA
- bootdo监控后台上传文件定期失效
热门文章
- Python3 From Zero——{最初的意识:007~函数}
- puppet运维自动化之用户管理
- POJ 1637 Sightseeing tour 混合图欧拉回路存在性判断
- spring-自动加载配置文件\使用属性文件注入
- C#与.NET程序员面试宝典 1.3 投递简历
- Effective C# Item22:使用事件定义外发接口
- 麻省理工学院(MIT)的公开课程
- Swift傻傻分不清楚系列(七)控制流
- .NET Framework 2.0 组件和非托管代码与交互操作详解(转)
- [转]矩阵分解在推荐系统中的应用