实现两个接口可以吗?
Is it ok to implement two interfaces?
我发现了这个问题:
所以如果一个class实现了两个接口,就有问题了:
假设接口Foo
指定了一个Foo
方法doStuffX()
,而接口Bar
指定了doStuffY()
。有人实现了让 class FooBar
实现展位接口。
后来,人们意识到 Foo
需要访问 doStuffY
实现,但在 Foo 的上下文中有一个稍微不同的规范。
现在,当 FooBar
传递给任何接受 Foo
并依赖 doStuffY()
的方法时,可能会中断。
所以,我的结论是一个人不应该实现一个以上的接口。那是对的吗?除了内部 classes 之外,是否有任何技术可用于将上下文名称添加到接口方法。我想传递 Foo
和 Bar
对它们的引用。还有更多方法吗?
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
这听起来像是把婴儿连同洗澡水一起倒掉了。
虽然确实可能会出现两个接口可能相互不兼容的情况,但禁止实现任何两个接口是过于严格的解决方案。真正的解决方案是在定义接口方面投入更多精力,以便它们:
- 不要互相冲突
- 不要无故随时间变化
这样的话,你描述的情况就不太可能发生了。
事实上,您的建议使接口完全无用。接口的要点是将多继承的一些好处引入单继承的语言中。当你只允许实现一个接口时,接口就变得毫无意义——当你只能实现一个接口时,你可以只使用单一继承。
结论是,一旦接口已经发布并且可能 used/implemented 由某人发布,则不应更改或扩展接口。如果您提到的需要出现,一个新的界面将是合适的,而不是改变现有的界面。
我发现了这个问题:
所以如果一个class实现了两个接口,就有问题了:
假设接口
Foo
指定了一个Foo
方法doStuffX()
,而接口Bar
指定了doStuffY()
。有人实现了让 classFooBar
实现展位接口。后来,人们意识到
Foo
需要访问doStuffY
实现,但在 Foo 的上下文中有一个稍微不同的规范。现在,当
FooBar
传递给任何接受Foo
并依赖doStuffY()
的方法时,可能会中断。
所以,我的结论是一个人不应该实现一个以上的接口。那是对的吗?除了内部 classes 之外,是否有任何技术可用于将上下文名称添加到接口方法。我想传递 Foo
和 Bar
对它们的引用。还有更多方法吗?
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
这听起来像是把婴儿连同洗澡水一起倒掉了。
虽然确实可能会出现两个接口可能相互不兼容的情况,但禁止实现任何两个接口是过于严格的解决方案。真正的解决方案是在定义接口方面投入更多精力,以便它们:
- 不要互相冲突
- 不要无故随时间变化
这样的话,你描述的情况就不太可能发生了。
事实上,您的建议使接口完全无用。接口的要点是将多继承的一些好处引入单继承的语言中。当你只允许实现一个接口时,接口就变得毫无意义——当你只能实现一个接口时,你可以只使用单一继承。
结论是,一旦接口已经发布并且可能 used/implemented 由某人发布,则不应更改或扩展接口。如果您提到的需要出现,一个新的界面将是合适的,而不是改变现有的界面。