多接口继承

时间:2010-03-03 06:40:21

标签: c# interface

我正在实现一组类和相应的接口,我希望每个类都有一组公共属性和一组仅特定于该类的专用属性。所以,我正在考虑按照以下方式定义接口:

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 个答案:

答案 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)

继承取决于类或接口的属性/行为。如果IWidget1IWidget2中的行为包含ICommon中的所有行为,那么您肯定可以继承IWidget1 : ICommonIWidget2 : ICommon,并且没有任何问题ComVisible。这只是OOPS概念。