实现两个接口可以吗?

Is it ok to implement two interfaces?

我发现了这个问题:

所以如果一个class实现了两个接口,就有问题了:

  1. 假设接口Foo指定了一个Foo方法doStuffX(),而接口Bar指定了doStuffY()。有人实现了让 class FooBar 实现展位接口。

  2. 后来,人们意识到 Foo 需要访问 doStuffY 实现,但在 Foo 的上下文中有一个稍微不同的规范。

  3. 现在,当 FooBar 传递给任何接受 Foo 并依赖 doStuffY() 的方法时,可能会中断。

所以,我的结论是一个人不应该实现一个以上的接口。那是对的吗?除了内部 classes 之外,是否有任何技术可用于将上下文名称添加到接口方法。我想传递 FooBar 对它们的引用。还有更多方法吗?

So, my conclusion is that one should not implement more than one interface. Is that correct?

这似乎是核选项。

这里真正的问题是 FooBar.doStuffY 没有实现接口强加的契约。 A "slightly different specification" 仍然不同并且违反了 Liskov 替换原则。如果你不这样做就不会有问题。

也许您需要 doStuffY 的内部版本,它以不同的方式处理事情并根据参数决定要做什么。这样您就可以遵守接口合同,并且仍然允许内部使用站点的偏差行为。

So, my conclusion is that one should not implement more than one interface

这听起来像是把婴儿连同洗澡水一起倒掉了。

虽然确实可能会出现两个接口可能相互不兼容的情况,但禁止实现任何两个接口是过于严格的解决方案。真正的解决方案是在定义接口方面投入更多精力,以便它们:

  1. 不要互相冲突
  2. 不要无故随时间变化

这样的话,你描述的情况就不太可能发生了。

事实上,您的建议使接口完全无用。接口的要点是将多继承的一些好处引入单继承的语言中。当你只允许实现一个接口时,接口就变得毫无意义——当你只能实现一个接口时,你可以只使用单一继承。

结论是,一旦接口已经发布并且可能 used/implemented 由某人发布,则不应更改或扩展接口。如果您提到的需要出现,一个新的界面将是合适的,而不是改变现有的界面。