接口(CLR via C# 读书笔记)

 

小点滴:之间考虑程序性能的时候,总是用TickCount来计算自己算法的耗时问题,但是它只能精确到毫秒。看CLR via C# 留意到 StopWatch 这个类,就是专门干这个事的,不错,精度还高,以后就用它了。

 

接口:

1、 规定:C#支持多接口继承,但不支持多类继承。

2、 C# 接口可以定义方法签名外,还可以定义属性、事件、索引,因为它们背后对应的都是方法。但是C#不支持静态方法(尽管CLR支持,但CLS不支持)。

3、 接口可以相互“继承”,其实这里的继承的味道已经变了,而是有点“联合约定”的味道。

4、 C#编译器要求接口的实现必须声明为public,并且CLR要求该方法应该声明为virtual,如果你没有在源代码上显示标注virtual关键字,编译器会在编译时为其添加virtualsealed关键字,这阻止子类覆写该方法;如果你显示标注了virtual在源码处,编译器是不会再添加sealed关键字的,所以这就允许了子类覆写该方法。

对于sealed接口方法,尽管子类不能覆写,但是子类可以再次继承同一接口,然后实现自己的方法,在具体应用的时候,会调用哪一个就看变量类型了。(但是要注意,应该给子类的同名方法加new 关键字,使其屏蔽父类的方法。)

5、 接口的显示实现:通常情况下,继承接口的类只要实现一个和接口一样方法签名的函数就可以了,编译器会知道两者之间的关联;另外一种情况,通过添加接口类名显示指明实现了哪个接口,这该情况下,不允许对该函数实现获取修饰符(如publicprivate),也不允许使用virtual修饰,编译器会将其编译为privat virtual sealed,也就是说既不能继承,也不能通过类的实例变量调用,只能通过接口变量的方式调用到它。书上还说其,不是一个正常的类方法,通过查看IL代码发现在函数体内多了.override [mscorlib]System.IDisposable::Dispose这么一句话,具体情况还没搞懂。

6、 泛型接口:这里有两点我感觉比较有意思,一是说如果有泛型,就尽量不要用以前的非泛型,因为非泛型为了实现通用性,参数变量往往是object类型,存在安全隐患和拆装箱子的问题。之所以还存在大量的非泛型应用是因为考虑向前兼容。二是继承泛型接口可以因为type的不同,而对同一泛型接口当作两接口。例如:

// this class implements the generic IComparable<T> interface twice

       public sealed class Number : IComparable<Int32>,IComparable<String>

       {

              // 代码省略

}

7、 泛型条件限制:不多说了,这属于泛型的问题,但是可以解决值类型装箱的问题,具体查书。

8、 解决两个接口存在同名函数(方法签名也相同)的问题,可以使用接口显示声明解决。

9、 书上说使用显示接口有很多问题,慎用!看了看确实,如果不是非使用其不解决的问题,就尽量不用。

10、关于设计基类还是设计接口的问题:基本原则是IS-A 还是Can-Do,从书上的意思好像比较倾向于说基类设计好。(具体情况具体分析吧)。

你可能感兴趣的:(读书笔记)