文章目录

  • 多态的概念
  • 多态的实现
  • 方法重载、重写、隐藏
    • 重载
    • 重写
    • 隐藏
  • 博主写作不容易,孩子需要您鼓励
  • 万水千山总是情 , 先点个赞行不行

多态的概念

什么是多态?
多态一次最早用于生物学,指同一种族的生物具有不同的特性。比如青蛙小时候是蝌蚪,长大了是青蛙,同是一种生物但是有不同的表现形式。
在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#多态相关推荐

  1. C# 用装饰模式实现蝌蚪变青蛙的过程

    在面向对象的理论中,始终强调是抽象与组合以及一些其他面向对象的机制比如继承,封装和多态. 前面的文章都将有抽象是什么,至于抽象如何使用,就是把实现往上总结共性而去除特性,由此得到抽象层次和实现层次,所 ...

  2. 谈谈C#中的三个关键词new , virtual , override(装载 Winner.Net)

    C#支持单继承,说到继承就不得不说new,virtual和override这三个关键词,灵活正确的使用这三个关键词,可以使程序结构更加清晰,代码重用性更高. 以下是msdn中对new,virtual和 ...

  3. 蝌蚪与青蛙是同一个物种么?

    最近在一本书上看到, 说蝌蚪的腿要是被砍了, 很快就可以在长出来, 而等他长成了青蛙, 却失去了这种能力. 于是我想, 为什么蝌蚪长成青蛙后, 就失去了这种能力呢? 是它在成长过程中的演变吗? 成年后 ...

  4. 谈谈C#中的三个关键词new , virtual , override

    谈谈C#中的三个关键词new , virtual , override C#支持单继承,说到继承就不得不说new,virtual和override这三个关键词,灵活正确的使用这三个关键词,可以使程序结 ...

  5. new,virtual,override,interface,delegate,event-------------C#——方法实现总结

    C#--方法实现总结 本文分两部分来写,第一部分:C#方法实现的理解与问题,第二部分:C#中方法实现的种类. 第一部分:C#方法实现的理解与问题 理解: 1. 使用virtual和override关键 ...

  6. c#中的interface abstract virtual override和new

    from:(http://hi.baidu.com/21tian/blog/item/aabfae6ed4a675de81cb4ab4.html) interface用来声明接口 1.只提供方法的规则 ...

  7. C#语言使用多态(接口与override) ——帮您剔除对面向对象多态性的疑惑

    多态是面向对象编程中三大机制之一,其原理建立在"从父类继承而来的子类可以转换为其父类"这个规则之上,换句话说,能用父类的地方,就能用该类的子类.当从父类派生了很多子类时,由于每个子 ...

  8. C# 子类实例化基类 基类使用不了子类的方法_C#学习笔记09--构造方法/析构方法/继承/多态/封装...

    一.构造方法 当创建一个类时, 系统会自动创建一个默认的无参构造方法, 这个方法和类同名, 在创建对象的时候自动调用. 默认的构造方法里面什么也没有, 重写之后就可以在创建对象的时候同时搞点事情了. ...

  9. java 计算器类图_多态计算器(封装、继承、多态、简单工厂)

    一.封装 向对象程序设计中,一个非常重要的技术便是封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.这样做的好处在于可以使类内部的具体 ...

最新文章

  1. 记录SpringBoot集成Shiro使用Redis作缓存遇到的一个问题(Key-Value)互换
  2. 前端面试常见HTML问题(一)
  3. linux时间修改-hwclock和date
  4. Spring的@Transactional注解踩坑
  5. 拿专属内推码!一汽-大众专场直播招聘来了
  6. rsa 返回值 验签 失败_解析蛋糕、面包制作失败的原因
  7. 《精通javascript》几个简单的函数(二)
  8. dockerfile中的env指令_Dockerfile中的ENV指令的具体使用详解
  9. BP神经网络预测(python)
  10. Echarts 实现 设备运行状态图 工业大数据展示
  11. ubuntu 16.04 deepin.com.wechat 微信登录提示版本过低解决方案
  12. 在windows 10下编译可在windows xp下使用的 opencv 3.2
  13. ev6 ev8 ev4a加密视频破解翻录提取教程
  14. 今天没有穿内裤._今天...
  15. 抖音3d相册html代码,抖音3D立体相册表白代码.doc
  16. 微信公众号订阅号申请注册教程
  17. 黄石城市职业学院计算机专业,黄石6所中职学校 14个“3+2”专业直升大学
  18. python getter setter_python的getter和setter方法使用详解
  19. 基于HANA数据库的BW4HANA
  20. bootdo监控后台上传文件定期失效

热门文章

  1. Python3 From Zero——{最初的意识:007~函数}
  2. puppet运维自动化之用户管理
  3. POJ 1637 Sightseeing tour 混合图欧拉回路存在性判断
  4. spring-自动加载配置文件\使用属性文件注入
  5. C#与.NET程序员面试宝典 1.3 投递简历
  6. Effective C# Item22:使用事件定义外发接口
  7. 麻省理工学院(MIT)的公开课程
  8. Swift傻傻分不清楚系列(七)控制流
  9. .NET Framework 2.0 组件和非托管代码与交互操作详解(转)
  10. [转]矩阵分解在推荐系统中的应用