《CLR via C#:框架设计》读书笔记 - 接口

本文详细解析了C#中隐式和显式接口方法实现的区别与应用,包括如何解决两个接口具有相同方法名的问题,以及如何通过显示接口类型方法实现来增强编译时类型安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

13.5 隐式和显示接口方法实现
返回

?显式接口和隐式接口的关系

1.隐式接口的实现

复制代码
1 class SimpleType : IDisposable
2 {
3 public void Dispose() { Console.WriteLine(“Dispose”); }
4 }
5
6 class Program
7 {
8 static void Main(string[] args)
9 {
10 SimpleType st = new SimpleType();
11 //调用公共Dispose方法
12 st.Dispose();
13 //调用IDisposable的Dispose方法
14 IDisposable d = st;
15 d.Dispose();
16 }
17 }
复制代码
上面调用的是同一个方法,输出都是:Dispose

  1. 显示接口的实现

1 class SimpleType : IDisposable
2 {
3 public void Dispose() { Console.WriteLine(“public Dispose”); }
4 //显式调用
5 void IDisposable.Dispose() { Console.WriteLine(“IDisposable.Dispose”); }
6 }
输出结果:

public Dispose

IDisposable.Dispose

注意:在C#定义一个显示接口方法是,不允许定义可访问性,编译器会设置其访问性为private。要调用它,只能通过接口类型的一个变量来进行。

13.8 实现多个具有相同方法名和签名的接口
返回

有两个接口具有相同方法名和签名的方法,必须用“显示接口的方法实现”。

复制代码
1 interface IWindow { object GetMenu();}
2 interface IRestaurant { object GetMenu();}
3 class Mario : IWindow, IRestaurant
4 {
5 object IWindow.GetMenu() { return null; }
6 object IRestaurant.GetMenu() { return null; }
7 }
复制代码
13.9 用显示接口类型方法实现来增强编译时类型安全
返回

如何接口的方法接受System.Object类型的参数或返回值时,就会丧失编译时的类型安全性,装箱也会发生,看如下代码:

复制代码
1 struct SomeValueType : IComparable
2 {
3 private int _x;
4 public SomeValueType(int x) { _x = x; }
5 public int CompareTo(Object other)
6 { return (_x - ((SomeValueType)other)._x); }
7 }
8
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 SomeValueType v = new SomeValueType(0);
14 object o = new object();
15 int n = v.CompareTo(v); //非预期装箱
16 n = v.CompareTo(o); //InvalidCastException异常
17 }
18 }
复制代码
可做如下改动避免以上错误:

复制代码
1 struct SomeValueType : IComparable
2 {
3 private int _x;
4 public SomeValueType(int x) { _x = x; }
5 public int CompareTo(SomeValueType other) //修改参数类型
6 { return (_x - other._x); }
7 int IComparable.CompareTo(Object other) //添加显示接口方法实现
8 { return CompareTo((SomeValueType)other); }
9 }
10
11 class Program
12 {
13 static void Main(string[] args)
14 {
15 SomeValueType v = new SomeValueType(0);
16 object o = new object();
17 int n = v.CompareTo(v); //没有装箱操作
18 n = v.CompareTo(o); //编译时就会报错
19 }
20 }
复制代码
但如果定义一个接口类型变量还是会报错,看如下代码:

复制代码
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 SomeValueType v = new SomeValueType(0);
6 IComparable c = v; //装箱
7 object o = new object();
8 int n = c.CompareTo(v); //非预期装箱
9 n = c.CompareTo(o); // InvalidCastException异常
10 }
11 }
复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值