c#---多态

在 C#语言中体现多态有三种方式:虚方法,抽象类, 接口


一、虚方法

  1. 什么是虚方法
    在父类中使用 virtual 关键字修饰的方法, 就是虚方法。在子类中可以使用 override 关键字对该虚方法进行重写。
class Animal
{public virtual void Speak(){Console.WriteLine("***********");}
}class Dog:Animal
{public override void Speak(){base.Speak();Console.WriteLine("汪汪汪");}public void Type(){Console.WriteLine("我是一只狗");}
}class Cat : Animal
{public override void Speak(){base.Speak();Console.WriteLine("喵喵喵");}public void Type(){Console.WriteLine("我是一只猫");}
}
  1. 何为里氏转换
    ①子类对象可以直接赋值给父类
Cat cat = new Cat();
Animal ann = cat;
cat.Speak();
cat.Type();
ann.Speak();
//报错,无法执行,ann.Type();

②如果父类中装的是子类对象,那么可以将该父类强制转为子类对象

Animal ani = new Dog();
ani.Speak();
//报错,无法执行,ani.Type();
Dog dog = (Dog)ani;
dog.Type();

③这里我们用的是强制类型转换,也可以使用is 和 as 转换

is: 如果转换成功, 返回 true, 失败返回 false;
as: 如果转换成功, 返回对应的对象, 失败返回 null

Animal ani = new Dog();
if(ani is Dog)
{Dog dog = ani as Dog;dog.Type();
}else if (ani is Cat)
{Cat cat = ani as Cat;cat.Type();
}

二、抽象方法

  1. 抽象方法的返回值类型前用关键字abstract修饰,且无方法体。

public abstract void Hello();

  1. 抽象方法必须存在于抽象类中。

abstract class Animal

在定义类的关键字class前面加 abstract 修饰的类就是抽象类。
子类继承抽象类,使用 override 关键字重写父类中所有的抽象方法

  1. 抽象类中不一定要有抽象方法, 但是抽象方法必须存在于抽象类中。
    抽象类不能被实例化, 因为抽象类中有抽象方法(无方法体)。

三、接口语法

  1. 抽象类到接口,当抽象类中所有的方法都是抽象方法的时候,这个时候可以把这个抽象类用另外,一种形式来表现,这种形式叫接口。

  2. 接口使用 interface 关键字定义,没有 class 关键字,接口名一般使用 “IXxxx”

  3. 接口中定义的方法不能有方法体,全是抽象方法,但又不需要用 abstract 修饰;

  4. 接口中的成员不允许添加访问修饰符,默认都是 public;

一个类可以实现多个接口,被实现的多个接口之间用逗号分隔开。
一个接口可以继承多个接口, 接口之间也要用逗号分隔。
类与类之间只能单继承。

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

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

相关文章

android apk没有源码如何修改程序

如果您拥有一个APK文件但没有源代码,您可以尝试以下几种方法来进行修改: 反编译APK:使用工具如apktool对APK文件进行反编译,这将为您提供源代码和资源文件。 动态调试:使用调试工具连接设备或模拟器,并动态…

重装前端整体流程

用户管理 --汇总 -- 明细-CSDN博客 一、node 这个看环境变量 2023最新版Node.js下载安装及环境配置教程(非常详细)从零基础入门到精通,看完这一篇就够了_nodejs安装及环境配置-CSDN博客 配置到国内镜像的时候,去看,淘…

理解固化的Maven依赖:spring-boot-starter-parent 与 spring-boot-dependencies

目录 理解固化的Maven依赖:spring-boot-starter-parent 与 spring-boot-dependencies1. spring-boot-starter-parent1.1 简介1.2 特点 2. spring-boot-dependencies2.1 简介2.2 特点 3. 异同点对比3.1 相同点3.2 不同点案例一:使用 spring-boot-starter-…

Java方法的重载

方法重载 1. 为什么需要方法重载 public class TestMethod{public static void main (String[] args){int a 10;int b 20;int ret add(a,b);System.out.println("ret "ret);double a2 10.5;double b2 20.5;double ret2 add(a2,b2);System.out.println("…

《QT实用小工具·六十二》基于QT实现贝塞尔曲线画炫酷的波浪动画

1、概述 源码放在文章末尾 该项目实现了通过贝塞尔曲线画波浪动画,可控制 颜色密度速度加速度 安装与运行环境 语言:C 框架:Qt 11.3 平台:Windows 将屏幕水平平均分为10块,在一定范围内随机高度的12个点(…

飞天使-k8s知识点29-kubernetes安装1.28.0版本

文章目录 选用版本初始化服务器,自己修改里面的ipreboot haproxy安装 ,可以参考我之前写的内核参数调整,安装docker 安装cri-dockerd开始安装集群工具下载镜像以及启用完毕之后 此时的coredns 不通结果展示 选用版本 k8s 1.24版本之前还可以使用docker&…

【初阶数据结构】顺序表OJ题讲解

前言 📚作者简介:爱编程的小马,正在学习C/C,Linux及MySQL。 📚本文收录与初阶数据结构系列,本专栏主要是针对时间、空间复杂度,顺序表和链表、栈和队列、二叉树以及各类排序算法,持…

基于ambari hdp的kafka用户授权读写权限

基于ambari hdp的kafka用户授权读写权限 版本Kafka 2.0.0添加自定义配置修改admin密码重启kafka授权读取授权写入有效通配符部分举例 版本Kafka 2.0.0 添加自定义配置 authorizer.class.name kafka.security.auth.SimpleAclAuthorizer super.users User:admin allow.everyo…

【LLM 论文】Step-Back Prompting:先解决更高层次的问题来提高 LLM 推理能力

论文:Take a Step Back: Evoking Reasoning via Abstraction in Large Language Models ⭐⭐⭐⭐ Google DeepMind, ICLR 2024, arXiv:2310.06117 论文速读 该论文受到的启发是:人类再解决一个包含很多细节的具体问题时,先站在更高的层次上解…

Android 屏幕适配全攻略(上)-掌握屏幕单位,应对千变万化的设备

本文从 Android 开发中常见的长度单位 px、dp、sp 入手,详细介绍了它们的特点及转换关系。 接着深入探讨了屏幕尺寸、分辨率、像素密度等重要的屏幕指标,帮助读者全面理解它们之间的联系。最后,通过实例代码演示了如何在代码中进行单位转换&…

三分钟上手安全渗透系统Kali Linux

kali linux系统集成了常用的安全渗透工具,省去了安装工具的时间,做安全相关的工作是非常推荐使用的。 安装Kalii Linux 安装系统 一般使用虚拟机进行安装,Kali Linux基于Debian内核,虚拟机的操作系统选择Debian 7.x 64 选择系统…

【SRC实战】一键完成全部任务获取奖励

挖个洞先 https://mp.weixin.qq.com/s/LkPfJuuP1K8vaFXRn-8wVg “ 以下漏洞均为实验靶场,如有雷同,纯属巧合 ” 01 — 漏洞证明 一、业务逻辑 “ 如何欺骗APP完成任务获取奖励? ” 1、记录金币数量20 2、浏览商品详情页 3、点击浏览提…

我们应该如何做参与式观察

记得多年以前,有个朋友问我:对于做观察,有人通过教授绘画技巧来教人如何做观察。你们研究员又不会画画,你们如何让人相信你们更会观察呢?坦率说,当时我被问住了,因为我从来没有进行过这样的对比…

day5Qt作业

服务器端 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//准备组件,初始化组件状态this->setFixedSize(800,600);chatwidget new QListWidge…

代码随想录算法训练营第四十九天| 123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

目录 题目链接:123.买卖股票的最佳时机III 思路 代码 题目链接:188.买卖股票的最佳时机IV 思路 代码 总结 题目链接:123.买卖股票的最佳时机III 思路 与之前买卖股票不同的是本题要求最多买卖两次,那么dp数组以及递推公式都…

攻击者正在利用AI,对保险公司发起大规模欺诈

保险欺诈一直是保险行业面临的重要挑战之一,尤其随着技术的进步,欺诈者也在不断更新其手段,利用AI技术,包括生成式模型、机器学习和数据分析工具等欺骗保险公司,而AI技术的应用正成为他们的新工具,使其犯罪…

如何打造个人IP?

打造个人IP(Intellectual Property)是当今社会中越来越受到关注的话题。个人IP指的是个人在某个领域内所拥有的独特的、具有商业价值的知识、技能、品牌和影响力。为什么要打造个人IP?如何打造个人IP?下面我将为您详细解答。 首先…

Navicat连接远程数据库时,隔一段时间不操作出现的卡顿问题

使用 Navicat 连接服务器上的数据库时,如果隔一段时间没有使用,再次点击就会出现卡顿的问题。 如:隔一段时间再查询完数据会出现: 2013 - Lost connection to MySQL server at waiting for initial communication packet, syste…

LinkedList链表

LinkedList 的全面说明 LinkList底层实现了双向链表和双端队列特点可以添加任意元素(元素可以重复),包括null线程不安全,没有实现同步 LinkedList 的底层操作机制 LinkedList底层维护了一个双向链表LinkList中维护了两个属性fi…

【算法入门赛】A.坐标变换(推荐学习)C++题解与代码

比赛链接:https://www.starrycoding.com/contest/8 题目描述 武汉市可以看做一个二维地图。 牢 e e e掌握了一项特异功能,他可以“瞬移”,每次瞬移需要分别设定 x x x和 y y y的偏移量 d x dx dx和 d y dy dy,瞬移完成后位置会…