可以实现两个接口吗?

时间:2015-12-30 12:48:53

标签: oop language-agnostic

我发现了这个问题:Two Interface with Same Method Name - Implementation of Methods

因此,如果一个类实现了两个接口,则存在一个问题:

  1. 假设接口Foo指定Foo方法doStuffX(),接口Bar指定doStuffY()。有人实现允许类FooBar实现booth接口。

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

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

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

3 个答案:

答案 0 :(得分:2)

  

所以,我的结论是不应该实现多个接口

这听起来就像把洗澡水扔出去一样。

虽然确实可能发生两个接口可能互不兼容,但禁止实现任何两个接口是过度限制性的解决方案。真正的解决方案是更加努力地定义接口,以便它们:

  1. 不要互相冲突
  2. 没有充分理由不随时间改变
  3. 这样,你描述的情况不太可能发生。

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

答案 1 :(得分:1)

结论是,一旦界面发布并且可能由某人使用/实施,就不应该更改或扩展界面。如果您提出需要,那么新界面将是合适的,而不是改变现有界面。

答案 2 :(得分:0)

  

所以,我的结论是不应该实现多个接口。这是对的吗?

这似乎是核选择。

这里真正的问题是FooBar.doStuffY没有实现接口强加的合同。 “略有不同的规范”仍然不同,违反了Liskov替代原则。如果你没有这样做那就不会有问题。

也许你需要一个内部版本的doStuffY来做不同的事情并根据参数决定做什么。这样您就可以遵守接口合同,并且仍允许内部使用网站的行为发生偏离。