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的。我没看到。在任何情况下,这都是一个实现细节,而不是原则上使接口不兼容的东西。接口应该是契约。句法形式和规则只是一种机制。