首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多接口继承

多接口继承
EN

Stack Overflow用户
提问于 2010-03-03 14:40:21
回答 4查看 1.8K关注 0票数 5

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

代码语言:javascript
复制
interface ICommon {...}  // Members common to all widgets
interface IWidget1 {...} // specialized members of widget type 1
interface IWidget2 {...} // specialized members of widget type 2

我正在尝试在接口继承和类继承之间做出选择。因此,具体地说,我可以这样做:

代码语言:javascript
复制
interface IWidget1 : ICommon {...}
interface IWidget2 : ICommon {...}
class Widget1 : IWidget1 {...}
class Widget2 : IWidget2 {...}

像这样的...or ...

代码语言:javascript
复制
class Widget1: ICommon, IWidget1 {...}
class Widget2: ICommon, IWidget2 {...}

有没有什么令人信服的理由去选择哪种方式呢?

更新:如果类必须是COM可见的,会影响答案吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-03 14:45:04

当且仅当实现IWidget1的类型还必须实现ICommon时,才应选择接口继承。在这两种情况下,该类将分别实现IWidget1和ICommon。唯一的区别是,如果让IWidget1从ICommon“派生”,就会强制要求IWidget1也必须是ICommon。

IEnumerable和ICollection就是一个很好的例子。每个ICollection都保证是IEnumerable,所以ICollection是从IEnumerable派生出来的。如果作为集合但不是可枚举是合法的或有意义的,那么ICollection的实现者就不必实现IEnumerable了。

无论您选择哪一个,都不会影响COM可见性。如果我没记错的话,.NET仍然会单独导出接口。

票数 6
EN

Stack Overflow用户

发布于 2010-03-03 14:45:09

使用Liskov替换原理来帮助你自己找到答案。

如果可以用IWidget1替换所有在ICommon1方面工作的客户端,那么您可以从ICommon1继承IWidget1。如果没有,就使用实现多个接口的类。

票数 3
EN

Stack Overflow用户

发布于 2011-09-21 02:17:42

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

如果您从ICommon派生IWidgetX,然后提出同时具有IWidget1和IWidget2行为的小部件,则可以进行多接口实现:

代码语言:javascript
复制
class Widget3 : IWidget1, IWidget2

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

另一方面,如果您不是从ICommon派生IWidgetX,那么您可以只实现所有这三个,而不必处理显式实现:

代码语言:javascript
复制
class Widget3 : IWidget1, IWidget2, ICommon

因此,如果您可能需要这样的Widget3类,那么最好不要从ICommon派生IWidgetX接口

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2369238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档