Base class 和 Interface的使用,有时很容易判断,有时又很难区分。
1)二者的主要区别:Base class 体现了“IS A”的关系,而Interface体现的是“CAN DO”的关系。因为C#不允许多重继承(Multi-inherit),所以,如果派生的类不能正确的反映IS-A的关系,就不要使用基类;而如果不同的类或对象(Type)包含了同样的CAN-DO的功能,那么就用接口。另外,值类型(Value type)只能使用接口,不能使用Base Class;
2)相比Interface,使用Base Class的有点:
i)使用方便(Easy of use):基类提供了大量现成的方法、功能,子类可以直接使用;而使用接口时,必须定义接口规定的所以的成员;
ii)执行稳定(consistent implementation): 不管关于接口的文档的描述有多么完善,其他人(第三方)在根据接口完善类时,也都会遇到很多问题,不可能做到100%的准确,这样就导致了bug的产生,而使用基类方式,定义一个可以正确执行的基类,而在派生类中适当的修改已达到最终需求,无疑会使程序更加稳定,出问题的几率更小;
iii)扩展(Versioning):如果给基类增加新的方法(method),那么,继承的子类可能无需编译即可使用基类中新增加这些方法;而使用接口的话,就不这么容易了,接口中增加新的声明后,必须在子类中去实现(implement)这些新增的方法。
3)使用interface的一些情况:对于那些提供的相对稳定(consistent)的操作的类,最好给它们定义一个统一的interface。 如,你的类中都有聚合对象(列表),都能够增加、插入、删除某一列表中的项目,那么,我们就可以让他们都继承与IList<T>接口,此时,你就可以对你的那些类进行增加、插入、删除等操作,而无需知道他们的具体类,因为你知道他们都实现了IList<T>接口的方法。
1)二者的主要区别:Base class 体现了“IS A”的关系,而Interface体现的是“CAN DO”的关系。因为C#不允许多重继承(Multi-inherit),所以,如果派生的类不能正确的反映IS-A的关系,就不要使用基类;而如果不同的类或对象(Type)包含了同样的CAN-DO的功能,那么就用接口。另外,值类型(Value type)只能使用接口,不能使用Base Class;
2)相比Interface,使用Base Class的有点:
i)使用方便(Easy of use):基类提供了大量现成的方法、功能,子类可以直接使用;而使用接口时,必须定义接口规定的所以的成员;
ii)执行稳定(consistent implementation): 不管关于接口的文档的描述有多么完善,其他人(第三方)在根据接口完善类时,也都会遇到很多问题,不可能做到100%的准确,这样就导致了bug的产生,而使用基类方式,定义一个可以正确执行的基类,而在派生类中适当的修改已达到最终需求,无疑会使程序更加稳定,出问题的几率更小;
iii)扩展(Versioning):如果给基类增加新的方法(method),那么,继承的子类可能无需编译即可使用基类中新增加这些方法;而使用接口的话,就不这么容易了,接口中增加新的声明后,必须在子类中去实现(implement)这些新增的方法。
3)使用interface的一些情况:对于那些提供的相对稳定(consistent)的操作的类,最好给它们定义一个统一的interface。 如,你的类中都有聚合对象(列表),都能够增加、插入、删除某一列表中的项目,那么,我们就可以让他们都继承与IList<T>接口,此时,你就可以对你的那些类进行增加、插入、删除等操作,而无需知道他们的具体类,因为你知道他们都实现了IList<T>接口的方法。
4)当然,有时定义接口和使用类继承效果没什么区别,如实现Compare功能,FLC提供了ICompareer<T>和Comparer<T>的抽象类供继承。看你的习惯了:)
本文转自Jack Niu博客园博客,原文链接:http://www.cnblogs.com/skywind/archive/2007/05/11/743002.html,如需转载请自行联系原作者