设计:基类还是接口?-摘自CLR Via C# 2

   我常常听到这样的问题“应该设计基类还是接口?”。答案通常并不明确。下面的指导方针可能有所帮助:

       1.IS-A vs. CA-DO关系 类型只能继承一个实现。如果派生类不具有与基类型的IS-A关系,就不要使用基类,而用接口。接口意味着CAN-DO关系。如果多种对象类型都有CAN-DO功能,就使用接口。例如,一个类型可以将自己的实例转换为另一个类型(IConvertible),一个类型可以序列化自己的实例(ISerializable)等。注意,值类型肯定继承自System.ValueType,因此,它们不能从一个任意的基类诞生。在这种情况下,必须使用一个CAN-DO关系并定义一个接口。

       2.易于使用 对开发人员而言,定义一个继承自基类的新类型通常比较实现一个接口的所以方法简单得多。基类型可以提供大量功能,所以派生类型可能只需要对其行为稍作改动。如果提供接口,新的类型必须实现所有成员方法。

       3. 一致性的实现 不管一个接口的contract文档化有多好,都无法保证任何人都能100%正确实现它。事实上,COM颇受这个问题之累,这个问题导致有的COM对象只能正确用于Microsoft Office Word或Microsoft Internet Explorer。通过为基类型提供一个良好的默认实现,然后开始使用能正常工作并通过良好测试一个类型,之后就可以对需要它的地方做出修改。

       4. 版本控制 如果向基类型添加一个方法,派生类型将继承这个新的方法的默认实现。事实上,用户的源代码甚至不需要重新编译。向一个接口添加一个新成员将强迫接口的继承者更改其源代码并重新编译。

posted @ 2010-04-09 20:17  VORO  阅读(594)  评论(0编辑  收藏  举报