Fork me on GitHub

接口

一、显示接口方法实现(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();
        }
    }
View Code

 

二、使用泛型接口的好处

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();
        }
    }
View Code

 

三、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,版本控制
向基类添加一个方法,派生类型将继承新方法。一开始使用的就是一个能正常工作的类型,用户的源代码甚至不需要重新编译。而向接口添加新成员,会强迫接口的继承者更改其源代码并重新编译

posted on 2017-04-24 22:09  *Hunter  阅读(146)  评论(0编辑  收藏  举报

导航

AmazingCounters.com