C# 接口介绍


.NET学习资料

.NET学习资料

.NET学习资料


一、接口的定义

在 C# 中,接口是一种特殊的抽象类型,它定义了一组方法签名,但不包含方法的实现。接口使用interface关键字来声明。例如,定义一个表示形状的接口IShape:

interface IShape
{double Area();double Perimeter();
}

在这个接口中,定义了Area和Perimeter两个方法,但没有给出具体的实现代码,这两个方法仅仅是方法签名,用于规范实现该接口的类型必须具备的行为。

二、接口的使用示例

接口不能直接实例化,需要由类或结构体来实现。下面通过一个Circle类实现IShape接口来展示其用法:

class Circle : IShape
{private double radius;public Circle(double radius){this.radius = radius;}public double Area(){return Math.PI * radius * radius;}public double Perimeter(){return 2 * Math.PI * radius;}
}

在上述代码中,Circle类通过: IShape语法表示实现了IShape接口,并提供了Area和Perimeter方法的具体实现。可以通过以下方式测试:

class Program
{static void Main(){Circle circle = new Circle(5);Console.WriteLine($"圆的面积: {circle.Area()}");Console.WriteLine($"圆的周长: {circle.Perimeter()}");}
}

这段代码创建了一个半径为 5 的圆,然后调用其实现的接口方法来计算并输出面积和周长。

三、C# 接口的特点

(一)完全抽象

接口只包含方法、属性、索引器和事件的声明,不包含任何实现代码。这使得接口成为一种纯粹的行为契约,实现接口的类型必须提供接口中所有成员的具体实现。

(二)多继承能力

C# 类不支持多重继承,但一个类可以实现多个接口。这为实现复杂的功能提供了灵活性。例如,一个类可以同时实现IComparable(用于比较)和IDisposable(用于资源释放)接口,从而具备多种不同的行为。

(三)接口成员访问修饰符

接口成员默认是公共的,并且不能使用任何访问修饰符(如public、private、protected等)来修饰。这是因为接口的目的是提供一种公共的契约,所有实现接口的类型都必须遵循这个契约。

(四)接口可以继承其他接口

一个接口可以从一个或多个其他接口继承。例如:

interface IAdvancedShape : IShape
{void Draw();
}

这里IAdvancedShape接口继承了IShape接口,同时增加了一个Draw方法。实现IAdvancedShape接口的类型必须实现IShape接口的所有成员以及IAdvancedShape接口新增的Draw方法。

(五)接口与抽象类的区别

抽象类可以包含实现代码和抽象成员,而接口只能包含抽象成员声明:抽象类可以为某些方法提供默认实现,子类可以继承并根据需要重写这些方法;而接口的所有成员都需要由实现类型来实现。

抽象类只能被一个类继承,而一个类可以实现多个接口:这使得接口在需要实现多种不同行为时更具优势。

抽象类可以有构造函数,而接口没有构造函数:因为接口只是一种行为定义,不涉及对象的创建和初始化。

四、接口的应用场景

(一)定义通用行为

在开发框架或库时,接口常用于定义一组通用的行为。例如,在ASP.NET Core 中,IEnumerable接口定义了对集合进行迭代的行为,许多集合类型(如List、Array等)都实现了这个接口,使得它们可以在各种需要迭代的场景中统一使用。

(二)实现多态性

通过接口实现多态性,使得不同类型的对象可以根据其自身的实现来响应相同的方法调用。例如,不同的图形类(如Circle、Rectangle、Triangle等)都实现IShape接口,在需要计算图形面积或周长时,可以统一调用接口方法,而不需要关心具体的图形类型。

(三)依赖注入

在依赖注入模式中,接口起着关键作用。通过接口定义依赖关系,而不是依赖具体的实现类,可以提高代码的可测试性和可维护性。例如,在一个服务类中,通过接口依赖另一个服务,在测试时可以很容易地提供一个模拟实现来替代真实的服务。

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

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

相关文章

Qt常用控件 多元素控件

文章目录 1. QListWidget1.1 常用属性和方法1.2 常用信号1.4 例子1,操作元素 2. QTableWidget2.1 常用属性和方法2.2 常用信号2.3 例子1,创建表格3.1 常用属性和方法3.2 常用信号3.3 例子1,创建树形结构 Qt中提供的多元素控件有: QListWidget…

33.Word:国家中长期人才发展规划纲要【33】

目录 NO1.2样式​ NO3​ 图表 ​ NO4.5.6​ 开始→段落标记视图→导航窗格→检查有无遗漏 NO1.2样式 F12/另存为:Word.docx:考生文件夹样式的复制样式的修改 样式的应用(没有相似/超级多的情况下)——替换 [ ]通配符&#x…

Qt展厅播放器/多媒体播放器/中控播放器/帧同步播放器/硬解播放器/监控播放器

一、前言说明 音视频开发除了应用在安防监控、视频网站、各种流媒体app开发之外,还有一个小众的市场,那就是多媒体展厅场景,这个场景目前处于垄断地位的软件是HirenderS3,做的非常早而且非常全面,都是通用的需求&…

【零拷贝】

目录 一:了解IO基础概念 二:数据流动的层次结构 三:零拷贝 1.传统IO文件读写 2.mmap 零拷贝技术 3.sendFile 零拷贝技术 一:了解IO基础概念 理解CPU拷贝和DMA拷贝 ​ 我们知道,操作系统对于内存空间&…

全栈开发:使用.NET Core WebAPI构建前后端分离的核心技巧(一)

目录 cors解决跨域 依赖注入使用 分层服务注册 缓存方法使用 内存缓存使用 缓存过期清理 缓存存在问题 分布式的缓存 cors解决跨域 前后端分离已经成为一种越来越流行的架构模式,由于跨域资源共享(cors)是浏览器的一种安全机制,它会阻止前端应用…

《Linux服务与安全管理》| 数据库服务器安装和配置

《Linux服务与安全管理》| 数据库服务器安装和配置 目录 《Linux服务与安全管理》| 数据库服务器安装和配置 任务一: 安装PostgreSQL数据库,设置远程登录,客户端可以成功登录并操作数据库。 任务二: 安装MySQL数据库&#xf…

Linux系统之whereis命令的基本使用

Linux系统之whereis命令的基本使用 一、whereis命令介绍二、whereis命令的使用帮助2.1 whereis命令的帮助信息2.2 whereis命令帮助解释 三、whereis命令的基本使用3.1 查找命令的位置3.2 仅查找二进制文件3.3 仅查找手册页3.4 输出实际使用的查找路径3.5 指定自定义搜索路径 四…

Autosar-以太网是怎么运行的?(Davinci配置部分)

写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 目录 1.Autosar ETH通讯软件架构 2.Ethernet MCAL配置 2.1配置对应Pin属性 2.2配置TXD引脚 2.3配…

【Block总结】CSAM,包含分割、关键点、切分等均适用!|即插即用

论文信息 标题: CSAM: A 2.5D Cross-Slice Attention Module for Anisotropic Volumetric Medical Image Segmentation 论文链接: https://arxiv.org/pdf/2311.04942 GitHub链接: https://github.com/aL3x-O-o-Hung/CSAM 创新点 CSAM(跨切片注意力模块&#xff…

解决PyG安装中torch-sparse安装失败问题:详细指南

1 问题描述 最近在学习GNN,需要使用PyTorch Geometric(PyG)库。在安装PyG的过程中,遇到了torch-sparse安装失败的问题,错误提示为: ERROR: Failed building wheel for torch-sparse本文将详细记录问题的解…

鸟哥Linux私房菜笔记(三)

鸟哥Linux私房菜笔记(三) 该第三部分和第四部分主要为原书的第十一章(正则表达式与文件格式化处理),第十二章学习shell脚本,第十六章(进程管理与SElinux初探部分),第十七…

python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素均值处理

【1】引言 前序学习进程中,对图像的操作均基于各个像素点上的BGR值不同而展开。 对于彩色图像,每个像素点上的BGR值为三个整数,因为是三通道图像;对于灰度图像,各个像素上的BGR值是一个整数,因为这是单通…

Spring Boot 2 快速教程:WebFlux处理流程(五)

WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找) 匹配条件包括…

小程序设计和开发:如何研究同类型小程序的优点和不足。

一、确定研究目标和范围 明确研究目的 在开始研究同类型小程序之前,首先需要明确研究的目的。是为了改进自己的小程序设计和开发,还是为了了解市场趋势和用户需求?不同的研究目的会影响研究的方法和重点。例如,如果研究目的是为了…

Vue3.0实战:大数据平台可视化(附完整项目源码)

文章目录 创建vue3.0项目项目初始化项目分辨率响应式设置项目顶部信息条创建页面主体创建全局引入echarts和axios后台接口创建express销售总量图实现完整项目下载项目任何问题都可在评论区,或者直接私信即可。 创建vue3.0项目 创建项目: vue create vueecharts选择第三项:…

Java自定义IO密集型和CPU密集型线程池

文章目录 前言线程池各类场景描述常见场景案例设计思路公共类自定义工厂类-MyThreadFactory自定义拒绝策略-RejectedExecutionHandlerFactory自定义阻塞队列-TaskQueue(实现 核心线程->最大线程数->队列) 场景1:CPU密集型场景思路&…

【VM】VirtualBox安装ubuntu22.04虚拟机

阅读本文之前,请先根据 安装virtualbox 教程安装virtulbox虚拟机软件。 1.下载Ubuntu系统镜像 打开阿里云的镜像站点:https://developer.aliyun.com/mirror/ 找到如图所示位置,选择Ubuntu 22.04.3(destop-amd64)系统 Ubuntu 22.04.3(desto…

C#,shell32 + 调用控制面板项(.Cpl)实现“新建快捷方式对话框”(全网首发)

Made By 于子轩,2025.2.2 不管是使用System.IO命名空间下的File类来创建快捷方式文件,或是使用Windows Script Host对象创建快捷方式,亦或是使用Shell32对象创建快捷方式,都对用户很不友好,今天小编为大家带来一种全新…

国产编辑器EverEdit - 输出窗口

1 输出窗口 1.1 应用场景 输出窗口可以显示用户执行某些操作的结果,主要包括: 查找类:查找全部,筛选等待操作,可以把查找结果打印到输出窗口中; 程序类:在执行外部程序时(如:命令窗…

Vue-data数据

目录 一、Vue中的data数据是什么?二、data支持的数据类型有哪些? 一、Vue中的data数据是什么? Vue中用到的数据定义在data中。 二、data支持的数据类型有哪些? data中可以写复杂类型的数据,渲染复杂类型数据时只要遵…