我正在实现一组类和相应的接口,我希望每个类都有一组公共属性和一组仅特定于该类的专用属性。所以,我正在考虑按照以下方式定义接口:
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 {...}
......或者像这样...
class Widget1: ICommon, IWidget1 {...}
class Widget2: ICommon, IWidget2 {...}
有没有令人信服的理由去某种方式?
更新:如果类必须是COM可见的,它会影响答案吗?
答案 0 :(得分:6)
当且仅当实现IWidget1 的类型必须也实现ICommon时,才应选择接口继承。在任何一种情况下,该类都将分别实现IWidget1和ICommon。唯一的区别是,如果你从ICommon“导出”IWidget1,你就强制执行IWidget1也必须是ICommon的事实。
一个很好的例子是IEnumerable和ICollection。每个ICollection都保证是IEnumerable,因此ICollection派生自IEnumerable。如果成为集合是合法的或有意义但不可枚举,那么ICollection的实现者也不必实现IEnumerable。
无论您选择哪种方式都不会影响COM的可见性。如果我没记错的话,.NET仍会单独导出接口。
答案 1 :(得分:3)
使用Liskov替代原则来帮助自己找到答案。
如果IWidget1可以替换所有使用ICommon1工作的客户端,那么您可以从ICommon1继承IWidget1。 如果没有使用实现多个接口的类。
答案 2 :(得分:1)
我认为在其他答案中没有考虑到另一个考虑因素。
如果您从ICommon派生IWidgetX,然后想出一个具有IWidget1和IWidget2行为的小部件,您可以执行多个接口实现:
class Widget3 : IWidget1, IWidget2
如果两个接口都来自ICommon,那么你的类中将有两个ICommon实现。这不是一个大问题,可以由multiple interface implementation处理,但它改变了逻辑。
另一方面,如果你没有从ICommon派生IWidgetX,你可以实现所有三个而不必处理显式实现:
class Widget3 : IWidget1, IWidget2, ICommon
所以,如果可以想象你可能需要这样的Widget3类 - 你最好不要从ICommon派生IWidgetX接口
答案 3 :(得分:0)
继承取决于类或接口的属性/行为。如果IWidget1
和IWidget2
中的行为包含ICommon
中的所有行为,那么您肯定可以继承IWidget1 : ICommon
和IWidget2 : ICommon
,并且没有任何问题ComVisible
。这只是OOPS概念。