我正在实现一组类和相应的接口,我希望每个类都有一组公共属性和一组特定于该类的专用属性。因此,我正在考虑按照以下方式定义接口:
interface ICommon {...} // Members common to all widgets
interface IWidget1 {...} // specialized members of widget type 1
interface IWidget2 {...} // specialized members of widget type 2我正在尝试在接口继承和类继承之间做出选择。因此,具体地说,我可以这样做:
interface IWidget1 : ICommon {...}
interface IWidget2 : ICommon {...}
class Widget1 : IWidget1 {...}
class Widget2 : IWidget2 {...}像这样的...or ...
class Widget1: ICommon, IWidget1 {...}
class Widget2: ICommon, IWidget2 {...}有没有什么令人信服的理由去选择哪种方式呢?
更新:如果类必须是COM可见的,会影响答案吗?
发布于 2010-03-03 14:45:04
当且仅当实现IWidget1的类型还必须实现ICommon时,才应选择接口继承。在这两种情况下,该类将分别实现IWidget1和ICommon。唯一的区别是,如果让IWidget1从ICommon“派生”,就会强制要求IWidget1也必须是ICommon。
IEnumerable和ICollection就是一个很好的例子。每个ICollection都保证是IEnumerable,所以ICollection是从IEnumerable派生出来的。如果作为集合但不是可枚举是合法的或有意义的,那么ICollection的实现者就不必实现IEnumerable了。
无论您选择哪一个,都不会影响COM可见性。如果我没记错的话,.NET仍然会单独导出接口。
发布于 2010-03-03 14:45:09
使用Liskov替换原理来帮助你自己找到答案。
如果可以用IWidget1替换所有在ICommon1方面工作的客户端,那么您可以从ICommon1继承IWidget1。如果没有,就使用实现多个接口的类。
发布于 2011-09-21 02:17:42
还有一个我认为在其他答案中没有考虑到的因素。
如果您从ICommon派生IWidgetX,然后提出同时具有IWidget1和IWidget2行为的小部件,则可以进行多接口实现:
class Widget3 : IWidget1, IWidget2如果这两个two接口都是从ICommon派生的,那么您的类中就会有两个ICommon实现。这不是一个大问题,可以由multiple interface implementation处理,但它改变了逻辑。
另一方面,如果您不是从ICommon派生IWidgetX,那么您可以只实现所有这三个,而不必处理显式实现:
class Widget3 : IWidget1, IWidget2, ICommon因此,如果您可能需要这样的Widget3类,那么最好不要从ICommon派生IWidgetX接口
https://stackoverflow.com/questions/2369238
复制相似问题