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.mfbz.cn/a/611124.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙OpenHarmony技术:【Docker编译环境】

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境,以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下: 独立Docker环境:适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。基于HPM的Docker环…

数学:人工智能领域的基石与灵魂

在科技日新月异的今天,人工智能(AI)已经渗透到了我们生活的方方面面,从智能家居、智能医疗到自动驾驶、智能客服,AI无处不在。然而,当我们赞叹于AI的神奇时,却往往忽视了其背后的推动力——数学…

2024.5.10

TCP服务器端 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置窗口大小和窗口大小固定this->resize(727,879);this->setFixedSize(727,879);//创建…

泰尔指数和泰尔指数模型:代码、案例及复现

泰尔指数模型是衡量个人或地区收入差距的重要工具。参考朱红根(2023年)老师的方法,《农业经济问题》使用泰尔指数分析了中国不同地区数字乡村发展水平的差异。该资料包括了Stata全流程代码、案例数据、参考文献,并提供了Excel计算…

解决mybatis的配置文件没代码提示的问题

1.将org.apache.ibatis.builder.xml包里的两个dtd文件复制出来,jar包里复制 2.复制dtd的url地址: http://mybatis.org/dtd/mybatis-3-mapper.dtd 一样的做法! 3.关闭两个配置文件,重新打开,就可以有代码提示了&…

【Linux】Linux——Centos7安装Tomcat

1.下载Tomcat 安装包 官网地址:Apache Tomcat - Apache Tomcat 9 Software Downloadshttps://tomcat.apache.org/download-90.cgi 2.将下载的安装包上传到 Xftp 上,我是直接放到 usr 下了 3.将安装包解压到 /usr/local/ tar -zxvf apache-tomcat-9.0.8…

Java入门——类和对象(上)

经读者反映与笔者考虑,近期以及往后内容更新将主要以java为主,望读者周知、见谅。 类与对象是什么? C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 JAVA是基于面向对…

c++:(map和set的底层简单版本,红黑树和AVL树的基础) 二叉搜索树(BST)底层和模拟实现

文章目录 二叉搜索树的概念二叉搜索树的操作二叉搜索树的查找find 二叉搜索树的模拟实现构造节点insertfinderase(细节巨多,面试可能会考)a.叶子节点b.有一个孩子左孩子右孩子 c.有两个孩子注意: erase代码 中序遍历 二叉搜索树的应用k模型k模型模拟实现的总代码 k-value模型k-…

Python语言基础学习(上)

目录 一、常量和表达式 二、变量和类型 2.1 认识变量 2.2 定义变量 2.3 变量类型 1、整数 int 2、浮点数(小数)float 3、字符串 str 4、布尔类型 2.4 类型转换 三、注释 3.1 单行注释 3.2 文档注释(或者多行注释) …

Java解决垂直鉴权问题(对垂直权限进行校验)

Java解决垂直鉴权问题(对垂直权限进行校验) 文章目录 Java解决垂直鉴权问题(对垂直权限进行校验)前言一、垂直鉴权是什么?二、实现过程1.新建接口权限菜单映射表2.项目初始化时加载接口菜单映射关系3.自定义过滤器拦截…

【LLM 论文】Chain-of-Verification:通过验证链来减少 LLM 幻觉

论文:Chain-of-Verification Reduces Hallucination in Large Language Models ⭐⭐⭐ arXiv:2309.11495 论文速读 LLM 由于不可避免地会产生幻觉,现有的研究主要鼓励 LLM 在产生 response 之前生成内部思想的推理链,或者通过 self-critique…

使用leafletjs实现地图洋流、风场气象6要素地图标注、等值面图

前期实现的功能由于数据失效无法显示效果,今天重新对接一个数据源进行展示,实现效果如下图: 访问地址:可视化三维 GIS 特效 - 沉浸式视觉体验呈现令人惊叹的三维 GIS 特效,提供沉浸式视觉体验。https://www.wheart.cn/…

HTTP有哪些失败原因?怎么处理?

在我们日常的网络活动中,http协议是不可或缺的,它负责在互联网上传输数据。然而,在使用HTTP协议进行数据传输时,我们可能会遇到一些失败的情况。这些失败的原因多种多样,包括但不限于服务器问题、网络问题、客户端问题…

RobbitMQ基本消息队列的消息发送过程

RabbitMQ: One broker to queue them all | RabbitMQ RabbitMQ官网 SpringAmqp的官方地址:Spring AMQP 代码示例:对着代码看应该能看明白 publisher:消息发送者的代码示例 package cn.itcast.mq.helloworld;import com.rabbitmq.client.Channel; import com.rabb…

Agent AI智能体的未来:无限可能

文章目录 终结者智能体正反影响自我意识开放心态 终结者 还记得那场人类与天网之间的史诗般的战斗吗?-- 《终结者》系列电影。 《终结者》系列电影是一部标志性的科幻动作系列,以紧张刺激的情节、令人难忘的角色和开创性的视觉效果而闻名。 电影探讨了…

中国地形可调节高度-UE5-UE4

2000坐标系,可进行高度调整。 支持版本4.21-5.4版本 下载位置:https://mbd.pub/o/bread/ZpWZm5Zs

数据库基础语法二

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo mysql -uroot -p #登陆数据库 create database zoo; #创建数据库zoo alter database zoo character set gbk collate gbk_…

rbac权限和多级请假设计的流程演示和前端页面实现

登录账号:t6普通用户 t7部门经理 m8总经理 密码都为:test 多级请假:7级及以下申请请假需要部门经理审核,若是请假时长超过72小时,则需要总经理审核,7级申请请将需要总经理审核,总经理请假自动审…

kubernetes删除命名空间下所有资源

kubernetes强制删除命名空间下所有资源 在 Kubernetes 中,当一个命名空间处于 Terminating 状态但不会完成删除过程时,通常是因为内部资源没有被正确清理。要强制删除这个命名空间及其所有资源,你可以采取以下步骤: 1. 确认命名空…

Linux应用(四)——系统IO函数

本节学习linux系统中常见的IO函数,讲解及其基本用法; 一、 open/close函数 open函数作用:系统调用open函数,打开指定路径的文件; int open(const char *pathname, int flags);打开一个存在的文件&#xff1…
最新文章