C# 图解教程 第5版 —— 第16章 接口

16.1 什么是接口

​ 接口是声明一组函数成员而不进行实现的引用类型,只能用类和结构来实现接口。

使用 IComparable 接口的示例

​ Array 类的 Sort 方法依赖于 IComparable 接口,其声明在 BCL 中,只包含唯一的 CompareTo 方法。图 16.1 中灰色表示该方法目前未实现。

image-20231116142404013 image-20231116142457254
图16.1 IComparable 接口

​ 调用 CompareTo 方法时,应该返回如下值:

  1. 负数:当前对象 < 参数对象。
  2. 正数:当前对象 > 参数对象。
  3. 0:两个对象相等。

​ 为自定义类实现 IComparable 接口后,就可以使用 Array.Sort 方法进行排序:

image-20231116142909330 image-20231116142922644
图16.2 在 MyClass 类中实现 IComparable 接口

16.2 声明接口

  1. 接口声明不能包含以下成员:
    • 数据成员。
    • 静态成员。
  2. 接口声明只能包含如下类型的非静态成员:
    • 方法。
    • 属性。
    • 事件。
    • 索引器。
  3. 函数声明不能包含任何实现代码,而是使用分号代替函数主体。
  4. 接口名称必须从大写的 I 开始。
  5. 可以声明分部接口。
image-20231116143215274
  1. 接口和接口成员的访问性有一些不同:
    • 接口声明可以有任何的访问修饰符。
    • 接口成员是隐式 public,不能有任何访问修饰符。
image-20231116143358650

16.3 实现接口

​ 要实现接口,类和结构必须:

  1. 在基类列表中包含接口名称。
  2. 为每一个接口成员提供实现。
image-20231116143618866

​ 重要事项如下:

  1. 必须实现接口的所有成员。
  2. 基类名称必须放在所有接口之前。
image-20231116143605165

16.4 接口是引用类型

​ 不能通过类对象的成员访问接口,只能通过将类对象引用强制转换为接口类型来获取接口引用。注意:接口引用不能调用类中不属于接口的其他成员。

image-20231116143834253 image-20231116143948372
图16.3 类对象的引用以及接口的引用

16.5 接口和 as 运算符

​ 如果尝试将类对象引用强制转换为类未实现的接口引用,则会抛出异常。使用 as 运算符可以避免抛出异常:

  • 如果实现了类接口,则 as 返回指向接口的引用。
  • 如果未实现接口,则 as 返回 null,而不抛出异常。
image-20231116144201337

16.6 实现多个接口

  1. 类或结构可以实现任意数量的接口
  2. 所有实现的接口必须列在基类列表中,以逗号分隔(在基类名称之后,如果有的话)。

16.7 实现具有重复成员的接口

​ 如果一个类实现了多个接口,并且其中一些接口具有相同的成员,则类可以实现单个成员来同时匹配所有重复成员的接口。

image-20231116144546091 image-20231116144409582 image-20231116144424750
图16.4 由同一个类成员实现多个接口

16.8 多个接口的引用(*)

16.9 派生成员作为实现(*)

16.10 显示接口成员实现

​ 可以创建显示接口以实现相同接口的分离:

  • 使用限定接口名称声明。
  • 限定接口名称的声明如下:
image-20231116144904561 image-20231116144917674
图16.5 显示接口成员实现

​ 因此,对于成员函数而言,有如下三种实现方法:

  1. 类级别实现(不依赖接口,专门提供给类对象调用)。
  2. 显示接口成员实现(依赖接口,专门提供给接口调用)。
  3. 类级别和显示接口成员实现(类和接口都能调用)。

​ 下面这个例子包含了两个显示接口成员实现,而没有类级别的实现。即,只能通过接口引用调用函数 PrintOut,而不能使用类对象调用:mc.PrintOut()

image-20231116145312032 image-20231116145342711 image-20231116145352993 image-20231116145405427
图16.6 具有显示接口成员实现的接口引用

访问显示接口成员实现

​ 显示接口成员实现只能通过接口来访问:

image-20231116145931192

16.11 接口可以继承接口

  • 类在基类列表中只能有一个类名;而接口可以有任意多个接口。
image-20231116150123716
  • 列表中的接口本身也可以继承其他接口。
  • 继承后的接口包含自己的成员和所有继承接口的成员。

16.12 不同类实现一个接口的示例(*)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔗理苦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值