【问题标题】:Is it ok to implement two interfaces?实现两个接口可以吗?
【发布时间】:2015-12-30 12:48:53
【问题描述】:

我发现了这个问题: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() 的方法时,可能会中断。

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

【问题讨论】:

  • “除了内部类还有其他技术吗...” 很有可能。但是你必须选择一种特定的语言,而不是问一个“语言不可知论”的问题。此外,当然,如果实现多个接口对您来说确实是一个普遍的坏主意,那么您为什么认为语言会允许您这样做?
  • 语言不仅允许实现多个接口,它们的标准库也充满了这样做的类。
  • 你的结论是完全错误的。 “可能会发生错误,因此我们不应该编程”。

标签: oop language-agnostic


【解决方案1】:

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

这听起来像是把婴儿和洗澡水一起扔出去。

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

  1. 不要互相冲突
  2. 不要无故更改

那样,你描述的情况不太可能发生。

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

【讨论】:

  • 我不认为接口是不兼容的。您可以显式实现这两个接口,并拥有两个具有相同名称和签名的方法。
  • 在 C# 中可以。在大多数其他非 .NET OO 语言中可能不是。
  • @MartinMaat 哦,这没有被标记为 .NET。我没有看到。无论如何,这是一个实现细节,而不是原则上会使接口不兼容的东西。接口应该是合约。句法形式和规则只是机制。
【解决方案2】:

结论是,一旦接口发布并可能被某人使用/实现,就不应更改或扩展接口。如果出现您提到的需求,最好使用新界面而不是更改现有界面。

【讨论】:

    【解决方案3】:

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

    这似乎是核选项。

    这里真正的问题是FooBar.doStuffY 没有实现接口强加的契约。 “稍微不同的规范”仍然是不同的,并且违反了 Liskov 替换原则。如果你不这样做就不会有问题。

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

    【讨论】:

    • 所以我应该责怪那个想将doStuffY 添加到Foo 的人,而不检查是否存在任何名称冲突。他最好叫它fooDoStuffY,这很丑。
    • 你可以这么说,但我不清楚如果他的方法不是正确的实现,他为什么要实现 Foo 。他可以有一个名为doS​​tuffY的方法,没问题。方法名称不必是唯一的。它只是不应该实现接口。
    • 因为他认为 doStuffY 是动作的描述性名称。如果没有额外的合同,两个发送者在发送相同的消息时可能意味着略有不同。
    • 但是他为什么要实现接口呢?
    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多