C#中实现接口的一些小知识(C#用abstract或virtual来实现接口成员)

文章目录

  • 不可用的修饰
  • 可用的修饰
    • 非抽象类实现接口
    • 抽象类实现接口
    • 抽象类与接口方法同名时一同实现

不可用的修饰

在C#中实现接口时,我们不能直接使用staticconst来实现接口成员,因为接口中的成员默认都是实例成员,并且它们表示一种契约,要求任何实现该接口的类都必须提供这些成员的具体实现。

可用的修饰

我们可使用关键字virtual或abstract来实现接口成员。

非抽象类实现接口

当一个非抽象类实现接口时,它必须为接口的所有成员提供具体实现,而这些方法可以直接实现或者通过virtual关键字使其成为虚方法,以便派生类可以进一步重写(override)它们。

using System;
// 定义一个接口
interface IAnimal
{void Eat();void Sleep();
}// 非抽象类实现接口
class Cat : IAnimal
{// 同时作为接口成员实现和虚方法,允许派生类进行覆盖public virtual void Eat(){Console.WriteLine("猫正在吃东西");}// 实现接口的Sleep方法,这里也用virtual关键字,不过不是必须的public virtual void Sleep(){Console.WriteLine("猫正在睡觉");}
}// 派生类覆盖Eat方法
class Kitten : Cat
{public override void Eat(){Console.WriteLine("小猫正在喝奶");}
}class Program
{static void Main(string[] args){Kitten myKitten = new Kitten();((IAnimal)myKitten).Eat(); // 输出 "小猫正在喝奶"myKitten.Sleep(); // 输出 "猫正在睡觉"}
}

运行结果如下所示,Cat类是一个非抽象类,它实现了IAnimal接口。尽管在非抽象类中,接口方法默认已经是实例方法,但我们仍然可以使用virtual关键字声明Eat和Sleep方法为虚方法,这样它们就可以被派生类Kitten覆盖。
Kitten类继承自Cat类,并覆盖了Eat方法以提供特定于小猫的行为。即使Eat方法在基类中既是接口实现又是虚方法,这并不影响它在派生类中的覆盖行为。:
在这里插入图片描述

抽象类实现接口

在抽象类(abstract class)中实现接口时,如果抽象类选择部分实现接口(也就是只提供部分成员的实现),那么未实现的接口成员可以在抽象类中声明为abstract,这样就强制所有继承自这个抽象类的子类去实现那些接口的未实现成员。

using System;
// 定义一个接口
interface IAnimal
{void Eat();void Sleep();
}// 抽象类实现接口,部分成员使用abstract关键字让子类去实现
abstract class AnimalBase : IAnimal
{public abstract void Eat(); // 这是抽象方法,需要子类实现// 实现接口的Sleep方法public virtual void Sleep(){Console.WriteLine("动物正在睡觉");}
}// 具体的子类,必须实现父类中未实现的抽象接口方法
class Dog : AnimalBase
{public override void Eat(){Console.WriteLine("狗正在吃东西");}// 可以选择覆盖父类中的虚方法public override void Sleep(){Console.WriteLine("狗正在打盹儿");}
}class Program
{static void Main(string[] args){Dog myDog = new Dog();myDog.Eat(); // 输出 "狗正在吃东西"myDog.Sleep(); // 输出 "狗正在打盹儿"}
}

实现结果如下图所示,AnimalBase是一个抽象类,它实现了IAnimal接口。其中Eat方法被声明为abstract,意味着所有继承自AnimalBase的类都必须提供这个方法的具体实现。
同时,Sleep方法在AnimalBase中提供了默认实现,并通过virtual关键字使其成为可覆盖的虚方法。在派生类Dog中,我们选择了覆盖Sleep方法以提供更具体的实现。
在这里插入图片描述

抽象类与接口方法同名时一同实现

在非抽象类中,如果一个方法同时是接口实现也是基类虚方法或抽象方法(即用virtualabstract修饰),这并不影响它作为接口成员的实现,也就是说,你只需要实现这个方法,那么就相当于同时实现了接口和抽象类(或虚方法),同时也允许派生类进行覆盖。

using System;
// 定义一个接口
interface IAnimal
{void Eat();void Sleep();
}// 抽象类Cat,包含与接口IAnimal.Eat同名的抽象方法
abstract class Cat
{// 与接口IAnimal中的Eat方法标签一致,声明为抽象方法public abstract void Eat();public abstract void Sleep();
}// 基类KittyCat 继承自抽象类Cat并实现接口IAnimal
class KittyCat : Cat, IAnimal
{// 实现抽象类Cat中未实现的Eat方法,同时也满足了接口IAnimal的要求public override void Eat(){Console.WriteLine("小猫正在吃东西");}public override void Sleep(){Console.WriteLine("小猫正在打盹儿");}
}class Program
{static void Main(string[] args){KittyCat myKitty = new KittyCat();((IAnimal)myKitty).Eat(); // 输出 "小猫正在吃东西"myKitty.Sleep(); // 输出 "小猫正在打盹儿"}
}

运行结果如下所示:

在这里插入图片描述

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

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

相关文章

Go语言物联网开发安科瑞ADW300/4G电能表数据上传mqtt平台-电表接线到传输数据完整流程

电能表功能说明 ADW300是方便用户进行用电监测、集抄和管理,可灵活安装在配电箱中,可用于电力运维、环保监管等在线监测类平台中。我们本案例是用于工业售电公司对出售电的管理,设备可以监控用电情况、故障监控及警报,售电公司可…

灵魂指针,教给(二)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看,已成习惯 创作不易,多多支持! 目录 一、数组名的理解 二、使用指针访问数组 三、一维数组传参本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组…

JavaWeb笔记 --- 一JDBC

一、JDBC JDBC就是Java操作关系型数据库的一种API DriverManager 注册驱动可以不写 Class.forName("com.mysql.jdbc.Driver"); Connection Statement ResultSet PrepareStatement 密码输入一个SQL脚本,直接登录 预编译开启在url中 数据库连接池

SpringBoot+Vue实现el-table表头筛选排序(附源码)

👨‍💻作者简介:在笑大学牲 🎟️个人主页:无所谓^_^ ps:点赞是免费的,却可以让写博客的作者开心好几天😎 前言 后台系统对table组件的需求是最常见的,不过element-ui的el…

智能指针基础知识【C++】【RAII思想 || unique_ptr || shared_ptrweak_ptr || 循环引用问题】

目录 一,为什么需要智能指针 二,内存泄露的基本认识 1. 内存泄露分类 2. 常见的内存检测工具 3,如何避免内存泄露 三,智能指针的使用与原理 1. RAII思想 2. 智能指针 (1. unique_ptr (2. shared_…

吴恩达deeplearning.ai:机器学习项目的完整周期伦理

以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏 文章目录 语音识别部署公平、偏见、伦理 这节博客中,我们主要看看构建一个机器学习的完整周期是什么,也就是说,当你想构建一个有价值的机器学习系统时&am…

FPGA IBUFG

IBUFG和IBUFGDS的输入端仅仅与芯片的专用全局时钟输入管脚有物理连接,与普通IO和其它内部CLB等没有物理连接。 所以,IBUFG输入的不能直接接另外信号。 GTH transceiver primitives are called GTHE3_COMMON and GTHE3_CHANNEL in UltraScale FPGAs, an…

【PyTorch】进阶学习:探索BCEWithLogitsLoss的正确使用---二元分类问题中的logits与标签形状问题

【PyTorch】进阶学习:探索BCEWithLogitsLoss的正确使用—二元分类问题中的logits与标签形状问题 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、Py…

[C语言]——分支和循环(4)

目录 一.随机数生成 1.rand 2.srand 3.time 4.设置随机数的范围 猜数字游戏实现 写⼀个猜数字游戏 游戏要求: (1)电脑自动生成1~100的随机数 (2)玩家猜数字,猜数字的过程中,根据猜测数据的⼤…

网络协议栈--应用层--HTTP协议

目录 本节重点理解应用层的作用, 初识HTTP协议 一、应用层二、HTTP协议2.1 认识URL2.2 urlencode和urldecode2.3 HTTP协议格式2.4 HTTP的方法2.4 HTTP的状态码2.5 HTTP常见的Header属性 三、最简单的HTTP服务器3.1 HttpServer.hpp3.2 HttpServer.cc3.3 HttpClient.cc3.4 log.hp…

5G智能制造热力工厂数字孪生可视化平台,推进热力行业数字化转型

5G智能制造热力工厂数字孪生可视化平台,推进热力行业数字化转型。在当今这个信息化、数字化的时代,热力生产行业也迎来了转型的关键时刻。为了提升生产效率、降低成本、提高产品质量,越来越多的热力生产企业开始探索数字化转型之路。而5G智能…

备份 ChatGPT 的聊天纪录

备份 ChatGPT 的聊天纪录 ChatGPT 在前阵子发生了不少次对话纪录消失的情况,让许多用户觉得困扰不已,也担心自己想留存的聊天记录消失不见。 好消息是,OpenAI 在 2023 年 4 月 11 日推出了 ChatGPT 聊天记录备份功能,无论是免费…

Flink并行度

1、Task flink中每个算子就是一个Task,比如flatMap、map、sum是一个Task。 2、SubTask 算子有几个并行度SubTask的数量就是几,比如 3、算子并行度 算子并行度指的是每个算子的并行度,可用env.setParallelism(1);设置所有算子的并行度&am…

微服务架构 | 多级缓存

INDEX 通用设计概述2 优势3 最佳实践 通用设计概述 通用设计思路如下图 内容分发网络(CDN) 可以理解为一些服务器的副本,这些副本服务器可以广泛的部署在服务器提供服务的区域内,并存有服务器中的一些数据。 用户访问原始服务器…

内联函数|auto关键字|范围for的语法|指针空值

文章目录 一、内联函数1.1概念1.2特性 二、auto关键字2.2类型别名思考2.3auto简介2.4auto使用细则2.4 auto不能推导的场景 三、基于范围的for循环(C11)3.1 范围for的语法 四、指针空值nullptr(C11)4.1 C98中的指针空值 所属专栏:C初阶 一、内联函数 1.1概念 以inline修饰的函…

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程

🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…

JAVA虚拟机实战篇之内存调优[4](内存溢出问题案例)

文章目录 版权声明修复问题内存溢出问题分类 分页查询文章接口的内存溢出问题背景解决思路问题根源解决思路 Mybatis导致的内存溢出问题背景问题根源解决思路 导出大文件内存溢出问题背景问题根源解决思路 ThreadLocal占用大量内存问题背景问题根源解决思路 文章内容审核接口的…

2024 GoLand激活,分享几个GoLand激活的方案

文章目录 GoLand公司简介我这边使用GoLand的理由GoLand 最新变化GoLand 2023.3 最新变化AI Assistant 正式版GoLand 中的 AI Assistant:_Rename_(重命名)GoLand 中的 AI Assistant:_Write documentation_(编写文档&…

【工具】Raycast – Mac提效工具

引入 以前看到同事们锁屏的时候,不知按了什么键,直接调出这个框,然后输入lock屏幕就锁了。 跟我习惯的按Mac开机键不大一样。个人觉得还是蛮炫酷的~ 调研 但是由于之前比较繁忙,这件事其实都忘的差不多了&#xff0…

C# Winform画图绘制圆形

一、因为绘制的圆形灯需要根据不同的状态切换颜色,所以就将圆形灯创建为用户控件 二、圆形灯用户控件 1、创建用户控件UCLight 2、设值用户控件大小(30,30)。放一个label标签,AutoSize为false(不自动调整大小),Dock为Fill(填充),textaglign为居中显示。 private Color R…