Oop 可以实现两个接口吗?
我发现这个问题: 因此,如果一个类实现了两个接口,则存在一个问题:Oop 可以实现两个接口吗?,oop,language-agnostic,Oop,Language Agnostic,我发现这个问题: 因此,如果一个类实现了两个接口,则存在一个问题: 假设接口Foo指定了Foo方法doStuffX(),而接口Bar指定了doStuffY()。有人实现了让类FooBar实现booth接口 后来,人们意识到,Foo需要访问doStuffY实现,但使用的规范略有不同,这在Foo的上下文中是有意义的 现在,当一个FooBar被传递给任何接受Foo并依赖于doStuffY()的方法时,可能会中断 因此,我的结论是不应该实现多个接口。对吗?除了内部类之外,还有其他技术可以用于向接口方法添
Foo
指定了Foo
方法doStuffX()
,而接口Bar
指定了doStuffY()
。有人实现了让类FooBar
实现booth接口Foo
需要访问doStuffY
实现,但使用的规范略有不同,这在Foo的上下文中是有意义的FooBar
被传递给任何接受Foo
并依赖于doStuffY()
的方法时,可能会中断因此,我的结论是不应该实现多个接口。对吗?除了内部类之外,还有其他技术可以用于向接口方法添加上下文名称。我想把
Foo
和Bar
引用传递给它们。还有别的办法吗
因此,我的结论是不应该实现多个接口。对吗
这似乎是核选择
这里真正的问题是,FooBar.doStuffY
没有实现接口强加的契约。“略有不同的规范”仍然不同,并且违反了Liskov替代原则。如果你没有那样做,就不会有问题
也许您需要一个内部版本的doStuffY
,它可以做不同的事情,并根据参数决定要做什么。这样,您就可以遵守接口契约,并且仍然允许内部使用站点的偏离行为
因此,我的结论是不应该实现多个接口
这听起来像是把婴儿和洗澡水一起扔出去
虽然两个接口可能互不兼容,但禁止实现任何两个接口是一种限制性太强的解决方案。真正的解决方案是将更多的精力放在定义接口上,以便它们:
事实上,您的建议使接口完全无用。接口的要点是将多重继承的一些好处引入到具有单一继承的语言中。当您只允许实现一个接口时,接口将变得毫无意义-当您只能实现一个接口时,您可以使用单一继承。结论是,一旦某个接口被发布并可能被某人使用/实现,就不应更改或扩展该接口。如果出现您提到的需求,新接口将是合适的,而不是更改现有接口。“除了内部类之外,还有其他技术吗…”很可能。但是你必须选择一种特定的语言,而不是问一个“语言不可知论”的问题。当然,如果实现多个接口对您来说确实是一个普遍的坏主意,那么为什么您认为语言会允许您这样做呢?语言不仅允许实现多个接口,它们的标准库中充满了这样做的类。您的结论完全错了。“可能会发生错误,因此我们不应该编程”。因此,我应该责怪那个想将
doStuffY
添加到Foo
的家伙,而不检查是否存在任何名称冲突。他最好叫它fooDoStuffY
,这很难看。你可以这么说,但我不清楚,如果他的方法不是正确的实现,他为什么要实现Foo。他可以有一个名为doStuffY的方法,没问题。方法名称不必是唯一的。它不应该实现接口,因为他认为doStuffY是动作的描述性名称。如果没有额外的合同,两个发送者在发送相同的消息时可能意味着略有不同。但他为什么要实现接口?我不认为接口是不兼容的。您可以显式地实现这两个接口,并且有两个具有相同名称和签名的方法。可能在大多数其他非.NET OO语言中都没有。@MartinMaat哦,这不是标记为.NET的。我没看到。在任何情况下,这都是一个实现细节,而不是原则上使接口不兼容的东西。接口应该是契约。句法形式和规则只是一种机制。