C#核心之面向对象-多态

面向对象-多态

在这里插入图片描述

文章目录

      • 1、Vob
        • 1、多态的概念
        • 2、多态的实现
      • 2、抽象类和抽象方法
        • 1、抽象类
        • 2、抽象方法
      • 3、接口
        • 1、接口的概念
        • 2、接口的声明
        • 3、接口的使用
        • 4、接口可以继承接口
        • 5、显示实现接口
        • 总结
          • 思考 电脑使用USB接口读取数据
      • 4、密封方法

1、Vob

1、多态的概念
多态:多种状态
让继承同一父类的子类们在执行相同方法时有不同的表现(状态)
主要目的同一父类的对象,执行相同的行为(方法)有不同的表现
解决问题让同一个对象有唯一行为的特征
2、多态的实现
编译时多态:函数重载
运行时多态:vob、抽象函数、接口v:virtual(虚函数)  //可以被子类重新o:override(重写)	//重写虚函数b:base(父类)	//代表父类,可以通过base来保留父类的行为
GameObject p = new Player("玩家1");
p.Atk();
(p as Player).Atk();
class GameObject
{public string name;public GameObject(string name){this.name = name;}public virtual void Atk(){Console.WriteLine("游戏对象进行攻击");}
}
class Player : GameObject
{public Player(string name) : base(name){}public override void Atk(){base.Atk();//保留父类atk方法Console.WriteLine("玩家对象进行攻击");}
}

2、抽象类和抽象方法

1、抽象类
概念被abstract修饰的类
特点1、不能被实例化2、可以包含抽象方法3、继承抽象类必须重新其抽象方法
2、抽象方法
又叫纯虚方法用abstract关键字修饰的方法
特点1、只能在抽象类中声明2、没有方法体3、不能私有4、继承后必须实现,用override重写
abstract class Graph
{public abstract float GetArea();public abstract float getLength();
}

3、接口

1、接口的概念
概念接口是行为的抽象规范是一种自定义类型关键字 interface
接口声明的规范1、不包含成员变量2、只包含方法、属性索引器、事件3、成员不能被实现4、成员可以不用写访问修饰符,不能是私有的5、接口不能继承类,但可以继承另一个接口
接口的使用规范1、类可以继承多个接口2、类继承接口狗,必须实现接口中所有成员
特点1、它和类的声明类似2、接口是用来继承的3、接口不能被实例化,但可以作为容器存储对象
2、接口的声明
关键字 interface
语法interface I接口名{}
接口是抽象行为的基类
接口命名规范:帕斯卡前加I
interface IFly{void Fly();	//方法string Name{	//属性get;set;}int this[int index]{	//索引器get;set;}event Action doSomthing;	//事件
}
3、接口的使用
接口用来继承
1、类可以继承1个类,n个接口
2、继承了接口后,必须实现其中的内容,并且必须是是public(不写默认为public3、实现的接口函数,可以加virtual再在子类重写
4、接口也遵循里氏替换原则,接口可以继承接口
IFly fly = new Person();
interface IFly
{void Fly();string Name{get;set;}int this[int index]{get;set;}event Action doSomthing;
}
class Animal { }
class Person : Animal, IFly
{public int this[int index] { get { return 0; } set { } }public string Name { get; set; }public event Action doSomthing;public virtual void Fly()   //可以加virtual继承下去{}
}
4、接口可以继承接口
接口继承接口时,不需要实现
待类继承接口后,类自己去实现所有内容
interface IWork{void Work();
}
interface IMove : IFly,IWork{void Move();
}
5、显示实现接口
当一个类继承两个接口,但是接口中存在着同名方法时
注意:显示实现接口时,不能写访问修饰符Player p = new Player();
(p as IAtk).Atk();
(p as ISuperAtk).Atk();
p.Atk();interface IAtk{void Atk();
}
interface ISuperAtk{void Atk();
}
class Player : IAtk,ISuperAtk{//显示实现接口,就是用接口名.行为名void IAtk.Atk(){}void ISuperAtk.Atk(){}public void Atk(){}
}
总结
继承类:是对象间的继承,包括特征行为等
继承接口:是行为间的继承,继承接口的行为规范,按照规范去实现内容
由于接口也遵循里氏替换原则,所以可以用接口容器装对象,就可以实现装载各种毫无关系但却有相同行为的对象注意:
1、接口值包含成员方法、属性、索引器、事件,并且都不实现,都没有访问修饰符
2、可以继承多个接口,但是只能继承一个类
3、接口可以继承接口,相当于行为合并,待子类继承时再去实现具体的行为
4、接口可以被显示实现,主要用于实现不同接口中的同名函数的不同表现
5、实现的接口方法,可以加virtual,之后子类再重写
思考 电脑使用USB接口读取数据
//多态来模拟移动硬盘、u盘、MP3插到电脑上读取数据
//移动硬盘与u盘都属于存储设备
//MP3属于播放设备,但是它们都能插再电脑上传输数据
//电脑提供了一个usb接口,请实现电脑的传输数据的功能
StorageDevice yingPan = new StorageDevice("硬盘");
StorageDevice uPan = new StorageDevice("u盘");
MP3 mP3 = new MP3();Computer c = new Computer();
c.usb1 = yingPan;
c.usb1.ReadData();
c.usb2 = uPan;
c.usb2.ReadData();
c.usb3 = mP3;
c.usb3.ReadData();interface IUSB
{void ReadData();
}
class StorageDevice : IUSB
{public string name;public StorageDevice(string name){this.name = name;}public void ReadData(){Console.WriteLine(name+"传输数据");}
}
class MP3 : IUSB
{public void ReadData(){Console.WriteLine("MP3传输数据");}
}
class Computer
{public IUSB usb1;public IUSB usb2;public IUSB usb3;
}

4、密封方法

关键字sealed
作用让虚方法或者抽象方法之后不能被重写
特点和override一起出现
abstract class Animal{public string name;public abstract void Eat();public virtual void Speak(){}   
}
class Person : Animal{public sealed override void Eat(){}public sealed override void Speak(){}
}

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

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

相关文章

为什么选择OpenNJet?OpenNJet下一代云原生应用引擎!OpenNJet开发实战!

前言导读 在当今这个数字化转型加速的时代,云原生技术已成为企业和开发者构建现代应用的首选路径。OpenNJet作为新一代云原生应用引擎,在国内外技术社区受到了广泛关注。 本文将深入探讨OpenNJet的特点、优势以及在开发实践中的应用,带您全…

用python画一个正八边形

1 问题 使用turtle库的turtle.fd()函数和turtle.seth()函数绘制一个边长100的正八边形。 2 方法 1、利用for循环解决如何画出图形中相同的八条边的问题。 2、再利用turtle.fd()函数和turtle.seth()函数画出完整的图形。 代码清单 1 import turtleturtle.pensize(2)d0for i in r…

【系统架构师】-选择题(十三)

1、在某企业的营销管理系统设计阶段,属性"员工"在考勤管理子系统中被称为"员工",而在档案管理子系统中被称为"职工",这类冲突称为( 命名冲突)。 同一个实体在同系统中存在不同的命名&am…

智慧旅游引领未来风尚,科技助力旅行更精彩:科技的力量推动旅游业创新发展,为旅行者带来更加便捷、高效和智能的旅行服务

目录 一、引言 二、智慧旅游的概念与特点 (一)智慧旅游的概念 (二)智慧旅游的特点 三、科技推动旅游业创新发展 (一)大数据技术的应用 (二)人工智能技术的应用 (…

【计算机科学速成课】笔记二

笔记一 文章目录 7.CPU阶段一:取指令阶段阶段二:解码阶段阶段三:执行阶段 8.指令和程序9.高级CPU设计——流水线与缓存10.早期编程方式11.编程语言发展史12.编程原理13.算法入门14.数据结构15.阿兰图灵 7.CPU CPU也叫中央处理器,…

在R的 RGui中,使用devtools 安装trajeR

创建于:2024.5.5 文章目录 1. 报错信息2. 尝试使用指定的清华镜像,没有解决3. 找到原因:官网把包删除了4. 尝试从网上下载,然后安装。没有成功5. 使用devtools安装5.1 尝试直接安装:install.packages("devtools&q…

关于YOLO8学习(四)模型转换为ncnn

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 关于YOLO8学习(三)训练自定义的数据集 简介 本文将会讲解: (1)如何通过PyCharm,进行pt模型的转换,最后输出一个适合手机端使用的模型 开发环境 win10、python 3.11…

C语言写一个终端进度条

C语言写一个终端进度条 这个功能挺简单的,主要有以下两点: 如何获取终端宽度如何让字符在原地闪烁 如何获取终端宽度 这里用到了设备控制接口函数ioctl(),下面简单的介绍一下这个函数的用法: ioctl是一个在Unix和类Unix系统中…

零基础学习数据库SQL语句之查询表中数据的DQL语句

是用来查询数据库表的记录的语句 在SQL语句中占有90%以上 也是最为复杂的操作 最为繁琐的操作 DQL语句很重要很重要 初始化数据库和表 USE dduo;create table tb_emp(id int unsigned primary key auto_increment comment ID,username varchar(20) not null unique comment…

glob库和split函数的用法

dir为一个文件夹,存放着三张jpg格式的图像 import glob dir rD:\My Data\Figure image_DCE_files glob.glob(f{dir}/*.jpg) image_DCE_files glob库可以获取文件夹下为个文件的绝对路径,会保存到一个列表中 获取的路径可以拆分为列表 image_DCE_files[1].split(…

HTTP常见面试题(一)

3.1 HTTP 常见面试题 HTTP基本概念 HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。 HTTP 的名字「超文本协议传输」,它可以拆成三个部分: 超文本 传输 协议 HTTP 是一个用在计算机世界里的协议。它使用计算机能够理解的语…

Lora训练笔记1——快速上手

准备工具 AKI大佬的整合包,一键解压即可。 度盘链接 提取码:p8uy 图片预处理 图片预处理:以一定规则裁剪原始的训练素材图片,并进行打标处理。 新建两个文件夹 input:存放原始图片的文件夹 preprocess-output:…

西湖大学赵世钰老师【强化学习的数学原理】学习笔记-1、0节

强化学习的数学原理是由西湖大学赵世钰老师带来的关于RL理论方面的详细课程,本课程深入浅出地介绍了RL的基础原理,前置技能只需要基础的编程能力、概率论以及一部分的高等数学,你听完之后会在大脑里面清晰的勾勒出RL公式推导链条中的每一个部…

OpenCV如何使用 GDAL 读取地理空间栅格文件(72)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV的周期性噪声去除滤波器(70) 下一篇 :OpenCV系列文章目录(持续更新中......) 目录 目标 代码: 解释: 如何使用 GDAL 读取栅格数据 注意 …

C++进阶----多态

1.多态的概念 1.1 概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同类型的对象去完成时会 产生出不同的状态。 举个例子:比如有一个基类Animal,它有两个子类Dog和Cat。每个…

数据结构---时间复杂度+空间复杂度

算法(algorithm)简单说就是解决问题的方法。方法有好坏,同样算法也是,有效率高的算法,也有效率低的算法。衡量算法的好坏一般从时间和空间两个维度衡量,也就是本文要介绍的时间复杂度和空间复杂度。有些时候,时间与空间…

2024年第七届大数据技术国际会议(ICBDT 2024)即将召开!

2024年第七届大数据技术国际会议(ICBDT 2024)将于2024年9月20-22日在中国杭州的浙江工商大学举行。数据驱动未来,技术引领潮流。从数据挖掘算法的优化,到数据处理速度的提升,再到数据安全与隐私保护的进步,…

Scikit是什么?

目录 一、Scikit是什么? 二、用Scikit做一个简单房价预测例子 三、sklearn知识点 一、Scikit是什么? Scikit就是scikit-learn,是一个免费软件机器学习库。 https://scikit-learn.org/stable/https://scikit-learn.org/stable/ 用于预测数…

SoundStream: 下一代的神经网络音频编解码器,实时压缩不牺牲音质

音频编解码技术的目标是,通过减少音频文件的大小来节省存储空间或减轻网络传输的负担。理想的情况下,即使音频被压缩,我们听到的声音与原版也应该没有任何区别。 过去,已经有不少编解码技术被开发出来,满足了这些需求…

Day13-JavaWeb开发-事务管理(回顾/进阶)AOP基础(入门/概念)AOP进阶(通知类型/顺序/切点表达式)AOP案例

1. 事务管理 1.1 事务管理-事务回顾 1.2 事务管理-事务进阶 rollbackFor propagetion 2. AOP基础 2.1 AOP基础-快速入门 2.2 AOP基础-核心概念 3. AOP进阶 3.1 AOP进阶-通知类型 3.2 AOP进阶-通知顺序 3.3 切入点表达式-execution 3.4 切入点表达式-annottation 3.5 AOP进阶…