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
    • 帮忙点个赞吧。哈哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm--3.内存管理

5.JVM内存管理 JAVA虚拟机在执行java程序的过程中&#xff0c;会把它管理的内存分成若干个不同的数据区域。 ------------------------------------------------------------------------------------— | 运行时数据区 | | ----------- -------- ----------------- | | | 方法…

[BZOJ2458][BeiJing2011]最小三角形

题目描述 Description Xaviera现在遇到了一个有趣的问题。平面上有N个点&#xff0c;Xaviera想找出周长最小的三角形。由于点非常多&#xff0c;分布也非常乱&#xff0c;所以Xaviera想请你来解决这个问题。为了减小问题的难度&#xff0c;这里的三角形也包括共线的三点。 输…

Makefile中的变量

Makefile中的变量 2007-11-03 12:03Makefile中变量有以下几个特征&#xff1a; 1. Makefile中变量和函数的展开&#xff08;除规则命令行中的变量和函数以外&#xff09;&#xff0c;是在make读取makefile文件时进行的&#xff0c;这里的变量包括了使用“”定义和使用指示符“d…

小技巧集锦

2019独角兽企业重金招聘Python工程师标准>>> jackson JsonDeserialize 使用方法&#xff1a; 实现方法注解写在set方法上。 public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {private SimpleDateFormat datetimeFormat new SimpleD…

interface-C#接口-统一的标准

文章目录接口的定义接口的实现实例1实例2接口的继承博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 接口是面向对象编程的一个重要技术&#xff0c;在C#中负责实现多重继承。一个接口定义一个协定&#xff0c;实现接口类或结构体必须遵守其协定…

JMeter入门(1):JMeter总体介绍及组件介绍

一、JMeter概述 JMeter就是一个测试工具&#xff0c;相比于LoadRunner等测试工具&#xff0c;此工具免费&#xff0c;且比较好用&#xff0c;但是前提当然是安装Java环境&#xff1b;JMeter可以做(1)压力测试及性能测试&#xff1b;(2)数据库测试&#xff1b;(3)Java程序的测试…

二层交换机、三层交换机和路由器的基本工作原理和三者之间的主要区别

二层交换机:二层交换技术是发展比较成熟&#xff0c;二层交换机属数据链路层设备&#xff0c;可以识别数据包中的MAC地址信息&#xff0c;根据MAC地址进行转发&#xff0c;并将这些MAC地址与对应的端口记录在自己内部的一个地址表中。 具体如下&#xff1a; &#xff08;1&…

Unity3D:视物有点眩晕的原因

设置Main Camera 的 Field of View 为100&#xff0c;看物体总觉得很不舒服。 设置为 60 就正常了。 根本原因&#xff0c;有待于分析 转载于:https://www.cnblogs.com/makebetter/p/7063694.html

使用jQuery清空file文件域的解决方案

使用jQuery清空file文件域的解决方案 var file $("#file") file.after(file.clone().val("")); file.remove();

更改mysql最大连接数

方法一&#xff1a; 打开cmd&#xff0c;用"mysql -u root -p;"命令进入mysql, 输入命令&#xff1a;show variables like "max_connections" 显示最大连接数 更改最大连接数 : set global max_connections 5000 方法二&#xff1a; 在my.ini加上 max_co…

根据HTML5 获取当前位置的经纬度【百度地图】【高德地图】

是想让地图的定位用户位置更准确一些。 查看了介绍&#xff1a; http://www.w3school.com.cn/html5/html_5_geolocation.asp 看介绍中拿数据挺简单。 <!DOCTYPE html> <html> <body> <p id"demo">点击这个按钮&#xff0c;获得您的坐标&…

C#抽象类与密封类-abstract-sealed

文章目录抽象类和抽象方法实现抽象方法接口、类和抽象类密封类博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 如果说继承是面向对象设计理论的基石&#xff0c;那么抽象理论和方法就是继承理论的顶梁柱。 抽象类和抽象方法 简单的说&#x…

vs2010快捷键

Ctrl M O: 折叠所有方法 Ctrl M M: 折叠或者展开当前方法 Ctrl M L: 展开所有方法 1、强迫智能感知&#xff1a;CtrlJ&#xff1b;2、强迫智能感知显示参数信息&#xff1a;Ctrl-Shift-空格&#xff1b;3、格式化整个块&#xff1a;CtrlKF4、检查括号匹配(在左右括号间切…

startup毕业论文

今天起得相对比较晚&#xff0c;为的是一个没有目的面试&#xff0c;去了的结果。只是打击一下自己的自信心&#xff0c;走的时候&#xff0c;面试官冷冷的说了一句&#xff0c;你的面试到此结束&#xff0c;是的&#xff0c;我并没有很伤心&#xff0c;在门外等面试的时候&…

Javascript实现信息滚动效果的方法

<html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>向上无缝滚动</title><style>body { font-size: 12px; line-height: 24px; text-algin: center; /* 页面内容居中 */}* { ma…

C# delegate与event,委托与事件

文章目录委托示例事件实例博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 委托和事件是C#中两个比较复杂的概念&#xff0c;这篇文章介绍两个概念与基本用法&#xff0c;让大家理解C#中的事件处理机制。 委托 委托也叫代理&#xff0c;就是把…

路由器与交换机的工作原理

路由器与交换机的工作原理 计算机网络往往由许多种不同类型的网络互连连接而成。如果几个计算机网络只是在物理上连接在一起&#xff0c;它们之间并不能进行通信&#xff0c;那么这种“互连”并没有什么实际意义。因此通常在谈到“互连”时&#xff0c;就已经暗示这些相互连接的…

Java的四种引用,强弱软虚,用到的场景(转+补充)

Q1&#xff1a;引用队列是什么&#xff1f;如何使用&#xff1f;使用的场景有哪些&#xff1f; A1:oracle的api文档的描述&#xff1a; https://docs.oracle.com/javase/7/docs/api/java/lang/ref/ReferenceQueue.htmlReference queues, to which registered reference objects…

C# lambda表达式与匿名方法

文章目录匿名方法Lambda表达式实例实例博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 C#中的匿名方法是在C#2.0引入的&#xff0c;它终结了声明委托的唯一方法是使用命名方法的时代。在C#更高版本中&#xff0c;Lambda表达式取代了匿名方法&a…

LINUx打包命令汇总

.tar 解包&#xff1a;tar xvf FileName.tar 打包&#xff1a;tar cvf FileName.tar DirName &#xff08;注&#xff1a;tar是打包&#xff0c;不是压缩&#xff01;&#xff09; ——————————————— .gz 解压1&#xff1a;gunzip FileName.gz 解压2&#xff1a;…