接口
一、显示接口方法实现(EIMI)
将定义方法的那个接口的名称作为方法的前缀
public class SimpleType : IDisposable { public void Dispose() { Console.WriteLine("SimpleType Dispose"); } //定义EIMI不允许指定可访问性。会自动设置为private。EIMI方法不能标记为virtual void IDisposable.Dispose() { Console.WriteLine("IDisposable Dispose"); } } class Program { static void Main(string[] args) { SimpleType s = new SimpleType(); s.Dispose(); IDisposable idis = s; idis.Dispose(); Console.ReadKey(); } }
二、使用泛型接口的好处
1,泛型接口提供了出色的编译时留下安全性
2,处理值类型时装箱次数会少很多
3,类可以实现同一个接口若干次,只要每次使用不同的类型参数
public class Number : IComparable<Int32>, IComparable<string> { public int CompareTo(string other) { throw new NotImplementedException(); } public int CompareTo(int other) { throw new NotImplementedException(); } }
三、EIMI最主要的问题
1,没有文档解释类型具体如何实现一个EIMI方法,也没有“智能感知”支持
2,值类型的实例在转换成接口时装箱
3,EIMI不能由派生类型调用
四、设计:基类还是接口
1,IS-A(指“属于”,例如,汽车属于交通工具)对比CAN-DO(指“能做某事”,例如,一个类型能将自己的实例装换为另一个类型)关系
类型只能继承一个实现。如果派生类和基类型建立不起IS-A关系,就不用基类而用接口。接口意味着CAN-DO关系。如果多种对象类型都“能”做某事,就为它们创建接口。例如,一个类型能将自己的实例转换为另一个类型(IConvertible),一个类型能序列化自己的实例(ISerializable)。注意,值类型必须从System.ValueType派生,所以不能从一个任意的基类派生。这时必须使用CAN-DO关系并定义接口
2,易用性
对于开发人员,定义从基类派生的新类型通常比实现接口的所有方法容易的多。基类型可提供大量功能,所以派生类型可能只需要稍作改动。而提供接口的话,新类型必须实现所有成员
3,一致性实现
无论接口协定订立得有多好,都无法保证所有人百分之百正确实现它。事实上,COM颇受该问题之累,导致有的COM对象只能正常用于Microsoft Office Word或者Microsoft Internet Explorer。而如果为基类型提供良好的默认实现,那么一开始得到的就是能正常工作并经过良好测试的类型。以后根据需要修改就可以了
4,版本控制
向基类添加一个方法,派生类型将继承新方法。一开始使用的就是一个能正常工作的类型,用户的源代码甚至不需要重新编译。而向接口添加新成员,会强迫接口的继承者更改其源代码并重新编译