C#类设计时,何时用类继承(Base Class)何时用接口(Interface)

简介:
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>接口的方法。

4)当然,有时定义接口和使用类继承效果没什么区别,如实现Compare功能,FLC提供了ICompareer<T>和Comparer<T>的抽象类供继承。看你的习惯了:)



本文转自Jack Niu博客园博客,原文链接:http://www.cnblogs.com/skywind/archive/2007/05/11/743002.html,如需转载请自行联系原作者

相关文章
|
5天前
|
C#
c# 所有类的最终基类:Object
c# 所有类的最终基类:Object
5 0
|
5天前
|
安全 C#
C#Webrequest类的使用
C#Webrequest类的使用
8 0
|
7天前
|
SQL 存储 C#
C# Web控件与数据感应之 TreeView 类
C# Web控件与数据感应之 TreeView 类
|
7天前
|
SQL 存储 Oracle
C# Web控件与数据感应之 CheckBoxList 类
C# Web控件与数据感应之 CheckBoxList 类
|
7天前
|
SQL 存储 Oracle
C# Web控件与数据感应之 Control 类
C# Web控件与数据感应之 Control 类
|
7天前
|
SQL 存储 Oracle
C# Web控件与数据感应之 ListControl 类
C# Web控件与数据感应之 ListControl 类
|
24天前
|
前端开发 API C#
C# 接口
C# 接口
19 1
|
2月前
|
C#
深入C#中的String类
深入C#中的String类
11 0
|
2月前
|
C#
C#学习系列相关之多线程(二)----Thread类介绍
C#学习系列相关之多线程(二)----Thread类介绍
|
2月前
|
C#
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)