代码之家  ›  专栏  ›  技术社区  ›  Tim Long

多接口继承

  •  5
  • Tim Long  · 技术社区  · 15 年前

    我正在实现一组类和相应的接口,我希望每个类都有一组公共属性和一组专门针对该类的属性。因此,我正在考虑定义以下方面的接口:

    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可见的,它会影响答案吗?

    4 回复  |  直到 14 年前
        1
  •  6
  •   Josh    15 年前

    如果并且仅当实现IwidGet1的类型 必须 同时实现ICommon。在这两种情况下,类都将分别实现IwidGet1和ICommon。唯一的区别是,如果您使iWidget1从icommon“派生”,则强制执行iWidget1也必须是icommon这一事实。

    一个很好的例子是IEnumerable和ICollection。每个ICollection都保证是IEnumerable,因此ICollection派生自IEnumerable。如果集合合法或有意义但不可枚举,那么ICollection的实现者也不必实现IEnumerable。

    无论您选择哪个,都不会影响COM可见性。如果调用正确,.NET仍将单独导出接口。

        2
  •  3
  •   Gishu    15 年前

    用李斯科夫替代原理来帮助自己找到答案。

    如果可以用iWidget1替换所有使用icommon1的客户端,则可以从icommon1继承iWidget1。 如果不是,则使用实现多个接口的类。

        3
  •  1
  •   Vroomfundel    14 年前

    还有一个我认为在其他答案中没有考虑到的因素。

    如果您从ICommon派生Iwidgetx,然后想出一个同时具有Iwidget1和Iwidget2行为的小部件,您可以执行多个接口实现:

    class Widget3 : IWidget1, IWidget2
    

    如果这两个接口都是从ICommon派生的,那么您的类中将有两个ICommon实现。这不是大问题,可以由 multiple interface implementation 但是它改变了逻辑。

    另一方面,如果您不从ICommon派生Iwidgetx,那么您只需实现这三个,而不必处理显式实现:

    class Widget3 : IWidget1, IWidget2, ICommon
    

    因此,如果可以想象您可能需要这样的widget3类,那么最好不要从icommon派生iwidgetx接口。

        4
  •  0
  •   Kangkan    15 年前

    继承性依赖于类或接口的属性/行为。如果行为 IWidget1 IWidget2 将所有行为包括在 ICommon 那么你一定可以继承 IWidget1 : ICommon IWidget2 : ICommon 关于 ComVisible .这只是个糟糕的概念。