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

news2024/12/25 9:24:04

面向对象-多态

在这里插入图片描述

文章目录

      • 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.coloradmin.cn/o/1644277.html

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

相关文章

libmodbus使用

安装可以看这个博客&#xff1a; https://blog.csdn.net/hanhui22/article/details/105786762 它的安装可以&#xff0c;但是编译测试看不太懂&#xff0c;我没跟着它的编译&#xff0c;完了后把/lib下的 放到开发板的/usr/lib下 编写代码: #include <stdio.h> #inclu…

研究论文的蓝图:精通论文大纲的编写技巧

研究论文大纲是一个补充文件&#xff0c;描述了按计划顺序纳入论文的所有主题&#xff0c;通常按段落分割。正常的研究论文大纲包括额外的细节&#xff0c;例如子主题和证据来源&#xff0c;以帮助作者保持结构。本文讨论了研究论文大纲的内容以及如何撰写。 研究论文大纲的含…

【AI】指定python3.10安装Jupyter Lab

家里电脑 13900K, bash 不识别pythoncmd可以,但是cmd似乎默认是python2.7这个是webrtc构建需要的.python3 则可以识别到但是版本是python3.12*多个版本如何通过制定的python3.10 的pip来安装软件,例如Jupyter Lab安装3.10 C:\Users\zhangbin\AppData\Roaming\Microsoft\Windo…

中国各地级市城投债详细数据(2006年-2023年2月)

01、数据简介 城投债又称为准市政债&#xff0c;发行主体是地方ZF投资平台&#xff0c;公开发行企业债和中期票据&#xff0c;其业主一般是地方基础设施建设&#xff0c;或者公益性项目主体&#xff0c;参与债券发行环节的当地ZF发债。 数据整理中国各地级市的城投债详细数据…

Inflate动态Huffman解压缩

上个已经实现GZIP压缩文件格式的Inflate静态Huffman解压&#xff0c;这个实现Inflate的无压缩输出和动态Huffman解压。 Java语言实现&#xff0c;Eclipse下编写。 范式Huffman解码实现&#xff0c;输入huffman编码&#xff0c;输出原始数据 // 范式huffman解码static class C…

推荐一个开源的MES系统

软件介绍 HM-MES是一款旨在帮助工厂实现生产计划、工艺管理和质量控制的工业生产管理软件。该软件基于Java Web技术和MySql数据库开发&#xff0c;拥有简洁、易用、安全和稳定等特点&#xff0c;适用于广泛的生产管理场景。 功能描述 1.产品和原材料双向溯源&#xff0c;支持二…

练习题(2024/5/3)

1对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; 树中…

meshlab: pymeshlab计算两个模型的布尔交集(mesh boolean intersection)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 本案例以两个圆环为例。 左侧为两个圆环&#xff0c;右上是重叠&#xff0c;右下是圆…

斯坦福开源端侧大模型Octopus v2,2B参数量可在移动端运行,性能超越GPT-4,准确率超Llama7B

前言 斯坦福大学研究人员近日推出了开源端侧大模型Octopus v2&#xff0c;引起了广泛关注。Octopus v2拥有20亿参数量&#xff0c;可以在智能手机、车载系统等终端设备上高效运行&#xff0c;在准确性和推理速度方面都超越了GPT-4。 Huggingface模型下载&#xff1a;https://h…

力扣每日一题113:路径总和||

题目 中等 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSu…

【Java】基本程序设计结构(二)

前言&#xff1a;上一篇我们详细介绍了Java基本程序设计结构中前半部分&#xff0c;一个简单的Java应用&#xff0c;注释&#xff0c;数据类型&#xff0c;变量与常量&#xff0c;运算符&#xff0c;字符串。包括本篇将延续上篇内容介绍后续内容&#xff0c;包括输入输出&#…

PC端Discord设置代理2022

开始使用 方法非常简单&#xff0c;在此下载release.zip并解压version.dll https://github.com/aiqinxuancai/discord-proxy/releases​github.com/aiqinxuancai/discord-proxy/releases 将version.dll放在Discord.exe所在目录&#xff08;如Discord有更新&#xff0c;则可能…

华为二层交换机与路由器连通上网实验

华为二层交换机与路由器连通上网实验 二层交换机是一种网络设备&#xff0c;用于在局域网&#xff08;LAN&#xff09;中转发数据帧。它工作在OSI模型的第二层&#xff0c;即数据链路层。二层交换机通过学习和维护MAC地址表&#xff0c;实现了数据的快速转发和广播域的隔离。 实…

Kannala-Brandt 鱼眼相机模型

最近在学习 ORB-SLAM3 的源代码&#xff0c;并模仿、重构了相机模型的实现 在学习的过程中发现针孔相机 (Pinhole) 与鱼眼相机 (Fisheye) 都有畸变参数&#xff0c;但是鱼眼相机无法使用 cv::undistort 函数去畸变 在对鱼眼相机的深度归一化平面进行可视化后&#xff0c;发现…

cordova build android 下载gradle太慢

一、 在使用cordova run android / cordova build android 的时候 gradle在线下载 对于国内的链接地址下载太慢。 等待了很长时间之后还会报错。 默认第一次编译在线下载 gradle-7.6.1-all.zip 然后解压缩到 C:\Users\Administrator\.gradle 文件夹中,下载慢导致失败。 二…

基于AT89C51单片机的温度上下限自动控制检报警设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89247694?spm=1001.2014.3001.5501 C 源码+仿真图+毕业设计+实物制作步骤+06 题 目 基于单片机的温度检测调节系统设计 姓 名 学 号 专业班级 指导教师 年 月 日 任务书 …

Android 14 变更及适配攻略

准备工作 首先将我们项目中的 targetSdkVersion和compileSdkVersion 升至 34。 影响Android 14上所有应用 1.最低可安装的目标 API 级别 从 Android 14 开始&#xff0c;targetSdkVersion 低于 23 的应用无法安装。要求应用满足这些最低目标 API 级别要求有助于提高用户的安…

图中有几个三角形

让我们先把三角形进行分类&#xff1a;1块组成的三角形、2块组成的三角形、依此类推。 1块组成的三角形有4个&#xff1a; 2块组成的三角形有&#xff1a;12,13,14,23,24,34.其中&#xff0c;14&#xff0c;23构不成三角形. 3块组成的三角形有&#xff1a;123,124,134,234。但…

Dragonfly 拓扑的路由算法

Dragonfly 拓扑的路由算法 1. Dragonfly 上的路由 (1)最小路由(2)非最小路由 2. 评估 Dragonfly 拓扑的路由算法 John Kim, William J. Dally 等人在 2008 年的 ISCA 中提出技术驱动、高度可扩展的 Dragonfly 拓扑。而文章中也提到了 针对 Dragonfly 拓扑的路由算法。本文对…

springboot医院信管系统

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,医院信管系统就是信息时代变革中的产物之一。 任何系统都要遵循…