.Net Framework Programming 读书笔记(13)
[2005-05-25]
接口,描述一个类型的功能。
15.1 接口与继承
将一个对象看成多个类型的能力通常称作多继承(multiple inheritance)。
CLR支持单实现继承和多接口继承。
CLR规定一个类型只能有一个基类型,System.Object是所有类型的最终基类型。这种继承称作实现继承(inplementation inheritance)
接口继承(interface inheritance):一个类型继承的是接口中的方法签名,而非方法的实现。接口方法不能包括任何实现,因此接口是不完整的(抽象的)。
注:一个接口的非静态方法总被认为是公有的虚方法。但在C#中如我们在一个类型内实现接口方法的时候忽略了virtual,那么该方法将被认为是一个密封(sealed)的虚方法--继承了该实现类型的其他类型将不可以再重写该方法。
选择设计:基类型/接口类型
--IS-A与CAN-DO关系: 一个类型是IS-A的关系。接口是CAN-DO关系。
--易用性: 基类型更易用;如果是接口,新类型就必须实现其所有的成员。
--一致的实现: 类型实现由困难(COM)。基类型有着良好的默认实现的,然后再根据需要对相应的部分 做改动。
--版本: 如果基类型添加了一个方法,那么派生类型自动继承新成员;用户源代码不需要重新 编译。但接口添加新成员将会强制要求接口的用户修改源代码。
例如,ArrayList/HashTable/Queue/SortedList的实现时接口的用户。
15.2 设计支持插件组件的应用程序
当我们创建可扩展的应用程序时,接口应该处于中心位置。
--创建一个程序集,然后再其中定义接口,接口的方法将用于应用程序和插件组件的通信机制。
--创建一个单独的程序集用于包含我们的应用程序所使用的其它类型。
--插件开发人员当然会在他们的应用程序中定义自己的类型。
应该避免自己定义的基类型出现在其它城程序集中(微软鼓励这么做)。但这么做是错误的,有可能导致一个程序集的好几个版本都被载入到同一个应用程序域(AppDomain)中---严重损伤系统性能。
15.3 使用接口改变已装箱的值类型中的字段
值类型/装箱、拆箱(struct 是值类型)
根据值类型/引用类型的使用情况不同,值类型和引用类型会有一些不同的行为。
[2005-05-30]
15.4 实现多个有相同方法的接口
当我们在一个类型中用完全限定接口名来定义一个接口方法时,该方法将被认为是私有方法,因此我们不能使用类型本身的引用来调用。当我们将该引用转型为一个接口时,该接口中定义的方法将可以被调用,这时它又成为一个公有的方法。
15.5 显示接口成员实现
较于运行时错误,开发人员更喜欢编译时错误。
谨慎使用显示接口方法实现:
public interface IComparable{
Int32 CompareTo(Object other);
}
struct SomeValueType:IComparable{
private Int32 x;
public SomeValueType(Int32 x){this.x=x;}
public Intew CompareTo(SomeValueType other){
return (x-other.x);
}
//注意:该方法没有标记public/protected
Int32 IComparable.CompareTo(Object other){
return CompareTo((SomeValueType)ohter);
}
}
//...调用时
static void Main(){
SomeValueType v1 = new SomeValueType(1);
SomeValueType v2 = new SomeValueType(2);
Int32 n;
n = v1.CompareTo(new Object()); //编译时错误
n = v1.CompareTo(v2); //调用CompareTo方法
}
浙公网安备 33010602011771号