[From 13]接口

一.接口的继承(13.4)
派生类不能重写sealed的接口方法。但派生类可重新继承同一个接口,并为接口方法提供自己的实现。在对象上调用接口时,调用的是该方法在该对象的类型中的实现。下例对此进行了演示:
 
 
二.泛型接口(13.6~13.7)
    1.泛型接口的好处(13.6):
        a.泛型接口提供了出色的编译时类型安全性。
        b.处理值类型时装箱次数会少很多
        c.类可以实现同一个接口若干次,只要每次使用不同的类型参数。
    2.泛型接口约束的好处(13.7):
        a.可将泛型类型参数约束为多个接口。
        b.传递值类型的实例时减少装箱。
 
 
三.隐式和显式接口方法
1.显式接口方法实现
在C#中,将定义方法的那个接口的名称作为方法名前缀(例如IDisposable.Dispose),就会创建显示接口方法实现(Explicit Interface Method Implementation,EIMI).注意,C#中不允许在定义显示接口方法时指定可访问性(比如public 或者 private)。但是,编译器生成方法的元数据时,可访问性会自动设为private,防止其他代码在使用类的实例时直接调用接口方法。只有通过接口类型的变量才能调用接口方法。
 
还要注意,EIMI方法不能标记为virtual,所以不能被重写。这是由于EIMI方法并非真的是类型对象模型的一部分,它只是将接口(一组类型或方法)和类型连接起来,同时避免公开行为/方法。
 
2.显示接口方法的使用情景
a.实现多个具有相同方法名和签名的接口
定义实现多个接口的类型时,这些接口可能定义了具有相同名称和签名的方法。例如,假定有以下两个接口:
要定义实现这两个接口的类型,必须要使用“显示接口方法实现”来实现这个类型的成员
b.当不存在泛型版本时,我们要通过“显示接口方法实现”(EIMI)来改善这个局面。(13.9 p271)
3.谨慎使用显式接口方法实现(13.10)
1.没有文档结束类型具体如果实现一个EIMI方法,也没有MicrosoftVisualStudio"智能感知"支持。
2.值类型的实例在转换成接口时装箱。
3.EIMI不能由派生类型调用
四.设计:基类还是接口
1.IS-A对比CAN-DO关系
    类型只能继承一个实现。如果派生类型和基类型建立不起IS-A关系,就不用基类而用接口。接口意味着CAN-DO关系。如果多种对象都“能”做某事,就为他们创建接口。
2.易用性
    对于开发人员,定义从基类派生的新类型通常比实现接口的所有方法容易多。基类型可提供大量功能,所以派生类型可能只需稍做改动。而提供接口的话。新类型必须实现所有成员。
3.一致性实现
    无论接口协定(contract)订得有多好,都无法保证所有人百分百正确实现它。事实上,COM颇受该问题之累,导致有的COM对象只能正常用于Microsoft Office Word或Microsoft Internet Explorer。而如果为基类型提供良好得默认实现,那么一开始得到的就是能正常工作并经过良好测试类型。以后根据需要修改就可以了。
4.版本控制
    向基类型添加一个方法,派生类将继承新方法。一开始使用的就是一个能正常工作的类型,用户的源代码甚至不需要重新编译。而向接口添加新成员,会强迫接口的继承者更改其源代码并重新编译
posted @ 2019-01-03 12:02  Real陈麟  阅读(139)  评论(0编辑  收藏  举报