C#学习记录——接口的实现

news2024/11/26 2:51:44

一小部分知识精英依旧直面核心困难,努力地进行深度钻研,生产内容;而大多数信息受众始终在享受轻度学习,消费内容。如果我们真的希望在时代潮流中占据一席之地,那就应该尽早抛弃轻松学习的幻想,锤炼深度学习能力,逆流而上,称为稀缺人才,否则人生之路势必会越走越窄。——《认知觉醒》

接口的实现

接口的定义方式与类相似,使用的代码如下:

interface IMyInterface
{
	//Interface member.
}

接口成员的定义与类成员的定义相似,但具有几个重要的区别:
【1】、不允许使用访问修饰符(public、private、protected或internal),所有接口成员都是隐式公共的。
【2】、接口成员不能包含代码体。
【3】、接口不能定义字段成员。
【4】、不能用关键字static、virtual、abstract或sealed来定义接口成员。
【5】、类型定义成员是禁止的。

但要隐藏从基接口中继承的成员,可以用关键字new来定义它们,例如:

interface IMyBaseInterface
{
	void DoSomething();
}
interface IMyDerivedInterface:IMyBaseInterface
{
	new void DoSomething();
}

其方式与隐藏继承的类成员的方式一样。

在接口中定义的属性可以定义访问块get和set中的哪一个能用于该属性(或将它们同时用于该属性),例如:

interface IMyInterface
{
	int MyInt{get;set;}
}

其中int属性MyInt有get和set存取器。对于访问级别有更严格限制的属性来说,可以省略它们中的任一个。

注意:这个语法类似于自动属性,但自动属性是为类(而不是接口)定义的,自动属性必须包含get和set存取器。

接口没有指定应如何存储属性数据。接口不能指定字段,例如用于存储属性数据的字段。最后,接口与类一样,可以定义为类的成员(但不能定义为其他接口的成员,因为接口不能包含类型定义)。

在类中实现接口

实现接口的类必须包含该接口所有成员的实现代码,且必须匹配指定的签名(包括匹配指定的get和set块),并且必须是公共的。例如:

public interface IMyInterface
{
	void DoSomething();
	void DoSomethingElse();
}
public interface MyClass:IMyInterface
{
	public void DoSomething(){};
	public void DoSomethingElse(){};
}

可使用关键字virtual或abstract来实现接口成员,但不能使用static或const。还可以在基类上实现接口成员,例如:

public interface IMyInterface
{
	void DoSomething();
	void DoSomethingElse();
}
public class MyBaseClass
{
	public void DoSomething(){}
}

public class MyDerivedClass:MyBaseClass,IMyInterface
{
	public void DoSomethingElse(){};
}

继承一个实现给定接口的基类,就意味着派生类隐式地支持这个接口,例如:

public interface IMyInterface
{
	void DoSomething();
	void DoSomethingElse();
}
public class MyBaseClass:IMyInterface
{
	public virtual void DoSomething(){};
	public virtual void DoSomethingElse(){};
}
public class MyDerivedClass:MyBaseClass
{
	public override void DoSomething(){};
}

显然,在基类中把实现代码定义为虚拟,派生类就可以替换该实现代码,而不是隐藏它们。如果要使用new关键字隐藏一个基类成员,而不是重写它,则方法IMyInterface.DoSomething()就总是引用基类版本,即使通过这个接口来访问派生类,也是这样。

1、显式实现接口成员

也可以由类显式地实现接口成员。如果这么做,就只能通过接口来访问该成员,不能通过类来访问。隐式成员可以通过类和接口来访问。

例如,如果类MyClass隐式地实现接口IMyInterface的方法DoSomething(),如上所述,则下面的代码就是有效的:

MyClass myObj=new MyClass();
myObj.DoSomething();

下面的代码也是有效的:

MyClass myObj=new MyClass();
IMyInterface myInt=myObj;
myInt.DoSomething();

另外,如果MyDerivedClass显示地实现DoSomething(),就只能使用后一种技术。其代码如下:

public class MyClass:IMyInterface
{
	void IMyInterface.DoSomething(){}
	public void DoSomethingElse(){}
}

其中DoSomething()是显示实现的,而DoSomethingElse()是隐式实现的。只有后者可以直接通过MyClass的对象实例来访问。

2、其他属性存取器

如果实现带属性的接口,就必须实现匹配的get/set存取器。这并不是绝对正确的——如果在定义属性的接口中只包含set块,就可给类中的属性添加get块,反之亦然。但只有隐式实现接口时才能这么做。另外,大多数时候都想让所添加的存取器的可访问修饰符比接口中定义的存取器的可访问修饰符更严格。因为按照定义,接口定义的存取器是公共的,也就是说,只能添加非公共的存取器。例如:

public interface IMyInterface
{
	int MyIntProperty{get;}
}
public class MyBaseClass:IMyInterface
{
	public int MyIntProperty{get;protected set;}
}

如果将新添加的存取器定义为公共的,那么能够访问实现该接口的类的代码也可以访问该存取器。但是,只能访问接口的代码就不能访问该存取器。

调试截图
图片为现场调试图

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

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

相关文章

Burp Suite 常用模块简介

Burp Suite 常用模块分为 目标站点(target)模块 代理(proxy)模块 攻击(Intruder)模块 重放(Repeater) 模块 Target模块是对站点资源的收集,与站点各资源包发出和相应包的记录 Proxy模块是核心模块,可以拦截数据包发送往浏览器,进行修改后再…

网络协议分析(2)判断两个ip数据包是不是同一个数据包分片

一个节点收到两个IP包的首部如下:(1)45 00 05 dc 18 56 20 00 40 01 bb 12 c0 a8 00 01 c0 a8 00 67(2)45 00 00 15 18 56 00 b9 49 01 e0 20 c0 a8 00 01 c0 a8 00 67分析并判断这两个IP包是不是同一个数据报的分片&a…

Android JetPack之启动优化StartUp初始化组件的详解和使用

一、背景 先看一下Android系统架构图 在Android设备中,设备先通电(PowerManager),然后加载内核层,内核走完,开始检查硬件,以及为硬件提供的公开接口,然后进入到库的加载。库挂载后开…

Winform控件开发(16)——Timer(史上最全)

前言: Timer控件的作用是按用户定义的时间间隔引发事件的计时器,说的直白点就是,他就像一个定时炸弹一样到了一定时间就爆炸一次,区别在于定时炸弹炸完了就不会再次爆炸了,但是Timer这个计时器到了下一个固定时间还会触发一次,上面那张图片就是一个典型的计时器,该定时器…

【Java】Spring Boot 配置文件

文章目录SpringBoot 配置文件1. 配置文件的作用2. 配置文件的格式3. properties配置文件说明3.1 properties基本语法3.2 读取配置文件3.3 properties缺点分析4. yml配置文件说明4.1 yml基本语法4.2 yml使用进阶4.2.1 yml配置不同的数据类型及null4.2.1 yml配置的读取4.2.2 配置…

Python蓝桥杯训练:基本数据结构 [哈希表]

Python蓝桥杯训练:基本数据结构 [哈希表] 文章目录Python蓝桥杯训练:基本数据结构 [哈希表]一、哈希表理论基础知识1、开放寻址法2、链式法二、有关哈希表的一些常见操作三、力扣上面一些有关哈希表的题目练习1、[有效的字母异位词](https://leetcode.cn…

0101基础概念-图-数据结构和算法(Java)

文章目录1 图1.1 定义1.2 4种图模型2 无向图2.1 定义2.2 术语后记1 图 1.1 定义 图是一种非线性的数据结构,表示多对多的关系。 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E)&#xf…

ecology9-谷歌浏览器下-pdf.js在渲染时部分发票丢失文字 问题定位及解决

问题 问题描述 : 在谷歌浏览器下,pdf.js在渲染时部分发票丢失文字;360浏览器兼容模式不存在此问题 排查思路:1、对比谷歌浏览器的css样式和360浏览器兼容模式下的样式,没有发现关键差别 2、✔使用Fiddler修改网页js D…

什么是线程死锁?如何解决死锁问题

死锁,一组互相竞争的资源的线程之间相互等待,导致永久阻塞的现象。 如下图所示: 与死锁对应的,还有活锁,是指线程没有出现阻塞,但是无限循环。 有一个经典的银行转账例子如下: 我们有个账户类…

操作系统权限提升(十四)之绕过UAC提权-基于白名单AutoElevate绕过UAC提权

系列文章 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述 操作系统权限提升(十三)之绕过UAC提权-MSF和CS绕过UAC提权 注:阅读本编文章前,请先阅读系列文章,以免造成看不懂的情况!! 基于白名单AutoElevate绕过…

2-MATLAB APP Design-下拉菜单栏的使用

一、APP 界面设计展示 1.新建一个空白的APP,在此次的学习中,我们会用到编辑字段(文本框)、下拉菜单栏、坐标区,首先在界面中拖入一个编辑字段(文本框),在文本框中输入内容:下拉菜单栏的使用,调整背景颜色,字体的颜色为黑色,字体的大小调为26. 2.在左侧组件库常用栏…

Qt音视频开发17-vlc内核回调拿图片进行绘制

一、前言 在众多播放器中,支持的种类格式众多,并支持DVD影音光盘,VCD影音光盘及各类流式协议,提供了sdk进行开发,这点是至关重要的,尽管很多优秀的播放器很牛逼,由于没有提供sdk第三方开发&…

【网络编程套接字(一)】

网络编程套接字(一)理解源IP地址和目的IP地址理解源MAC地址和目的MAC地址理解源端口号和目的端口号PORT VS PID认识TCP协议和UDP协议网络字节序socket编程接口socket常见APIsockaddr结构简单的UDP网络程序服务端创建套接字服务端绑定字符串IP VS 整数IP客…

面试官: 你知道 JWT、JWE、JWS 、JWK嘛?

想起了 之前做过的 很多 登录授权 的项目 它相比原先的session、cookie来说,更快更安全,跨域也不再是问题,更关键的是更加优雅 ,所以今天总结了一篇文章来介绍他 JWT 指JSON Web Token,如果在项目中通过 jjwt 来支持 J…

Springboot整合 Thymeleaf增删改查一篇就够了

很早之前写过Thymeleaf的文章,所以重新温习一下,非前后端分离,仅仅只是学习 官网: https://www.thymeleaf.org/ SpringBoot可以快速生成Spring应用,简化配置,自动装配,开箱即用。 JavaConfigur…

【java基础】枚举类(enum)

文章目录基本介绍快速使用字段、方法、构造器枚举类方法toString方法valueOf方法values方法ordinal方法基本介绍 在java中有一种特殊的类型就是枚举类,对于一个有限的有固定值的集合,我们就可以考虑使用枚举类来进行表示,例如服装的大小为 小…

linux shell 入门学习笔记15 shell 条件测试

概念 shell的条件测试目的是得出真和假。 shell 提供的条件测试语法 test 命令 [] 中括号命令 语法*: test条件测试 test命令用来评估一个表达式,他的结果是真,还是假,如果条件为真,那么命令执行状态结果就为0&…

【蓝桥杯集训·周赛】AcWing 第92场周赛

文章目录第一题 AcWing 4864. 多边形一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第二题 AcWing 4865. 有效类型一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第三题 AcWing 4866. 最大数量一、题目1、原…

Spring之丐版IOC实现

文章目录IOC控制反转依赖注入Bean的自动装配方式丐版IOC实现BeanDefinition.javaResourceLoader.javaBeanRegister.javaBean和DI的注解BeanFactory.javaApplicationContext测试,实现在这里插入图片描述大家好,我是Leo。Spring核心中依赖注入和IOC容器是非…

JWT令牌

1.普通令牌的问题 客户端申请到令牌,接下来客户端携带令牌去访问资源,到资源服务器将会校验令牌的合法性。 从第4步开始说明: 1、客户端携带令牌访问资源服务获取资源。 2、资源服务远程请求认证服务校验令牌的合法性 3、如果令牌合…