《CLR via C#》读书笔记 之 接口
2013-02-27 11:14
302 查看
第十三章 接口
2013-02-2713.5 隐式和显示接口方法实现
1. 隐式接口的实现
2. 显示接口的实现
13.8 实现多个具有相同方法名和签名的接口
13.9 用显示接口类型方法实现来增强编译时类型安全
ToDo: 什么时候使用接口和什么时候使用类
13.5 隐式和显示接口方法实现
返回?显式接口和隐式接口的关系
1.隐式接口的实现
class SimpleType : IDisposable { public void Dispose() { Console.WriteLine("Dispose"); } } class Program { static void Main(string[] args) { SimpleType st = new SimpleType(); //调用公共Dispose方法 st.Dispose(); //调用IDisposable的Dispose方法 IDisposable d = st; d.Dispose(); } }
上面调用的是同一个方法,输出都是:Dispose
2. 显示接口的实现
class SimpleType : IDisposable { public void Dispose() { Console.WriteLine("public Dispose"); } //显式调用 void IDisposable.Dispose() { Console.WriteLine("IDisposable.Dispose"); } }
输出结果:
public Dispose
IDisposable.Dispose
注意:在C#定义一个显示接口方法是,不允许定义可访问性,编译器会设置其访问性为private。要调用它,只能通过接口类型的一个变量来进行。
13.8 实现多个具有相同方法名和签名的接口
返回有两个接口具有相同方法名和签名的方法,必须用“显示接口的方法实现”。
interface IWindow { object GetMenu();} interface IRestaurant { object GetMenu();} class Mario : IWindow, IRestaurant { object IWindow.GetMenu() { return null; } object IRestaurant.GetMenu() { return null; } }
13.9 用显示接口类型方法实现来增强编译时类型安全
返回如何接口的方法接受System.Object类型的参数或返回值时,就会丧失编译时的类型安全性,装箱也会发生,看如下代码:
struct SomeValueType : IComparable { private int _x; public SomeValueType(int x) { _x = x; } public int CompareTo(Object other) { return (_x - ((SomeValueType)other)._x); } } class Program { static void Main(string[] args) { SomeValueType v = new SomeValueType(0); object o = new object(); int n = v.CompareTo(v); //非预期装箱 n = v.CompareTo(o); //InvalidCastException异常 } }
可做如下改动避免以上错误:
struct SomeValueType : IComparable { private int _x; public SomeValueType(int x) { _x = x; } public int CompareTo(SomeValueType other) //修改参数类型 { return (_x - other._x); } int IComparable.CompareTo(Object other) //添加显示接口方法实现 { return CompareTo((SomeValueType)other); } } class Program { static void Main(string[] args) { SomeValueType v = new SomeValueType(0); object o = new object(); int n = v.CompareTo(v); //没有装箱操作 n = v.CompareTo(o); //编译时就会报错 } }
但如果定义一个接口类型变量还是会报错,看如下代码:
class Program { static void Main(string[] args) { SomeValueType v = new SomeValueType(0); IComparable c = v; //装箱 object o = new object(); int n = c.CompareTo(v); //非预期装箱 n = c.CompareTo(o); // InvalidCastException异常 } }
相关文章推荐
- 接口(CLR via C# 读书笔记)
- 《CLR via C#》读书笔记(9)– 接口
- C#夯实基础之接口(《CLR via C#》读书笔记)
- 【读书笔记】《框架设计(第2版)CLR Via C#》中两个比较有趣的知识点
- 《CLR via C#》读书笔记(一)——CLR的执行模式
- 《CLR via C#》读书笔记(10)– 我不知道的String
- 《CLR via C#》读书笔记-CLR寄宿与AppDomain
- CLR via C# 读书笔记2-2
- CLR via C# 读书笔记 3-3 Thread.Sleep -1 0 1 和其他
- 《CLR Via C# 第3版》笔记之(十五) - 接口
- 《CLR via C#:框架设计》读书笔记 - 类型基础
- CLR via C# 读书笔记 3-6 比较APM和EAP(异步编程模型和基于事件的编程模式)
- CLR via C# 读书笔记 4-2 线程和锁的一些使用原则
- CLR via C# 读书笔记(三)关于"is" 和"as"操作符
- 《CLR via C#》读书笔记 之 类型基础
- clr via c#(框架设计)第3版读书笔记
- CLR via C# 3 读书笔记(2):第1章 CLR执行模型 — 1.2 将托管模块组合为程序集
- CLR via C# 读书笔记---常量、字段、方法和参数
- 关于.NET(C#)中字符型(Char)与数字类型的转换, CLR via c# 读书笔记
- CLR via C# 读书笔记 6-2 不同AppDomain之间的通信