【问题标题】:Modifying all classes which implemented by interface [closed]修改接口实现的所有类[关闭]
【发布时间】:2015-03-24 16:13:04
【问题描述】:

假设我有一个类似的界面

interface IMessage
{
    void DoSomething();
    void DoAnother();
}

假设在一个大项目中,有 100 个类实现了这个接口。但是如果我向 IMessage 接口添加一个新方法,比如 Foo();

interface IMessage
{
   void DoSomething();
   void DoAnother();
   void Foo();
}

所以我的其他 100 个实现此接口的类必须更改。
那么这里有什么问题吗?改变所有班级?我听说 Open Close prensible 所以我使用了接口,但在那种情况下,逻辑是什么?

【问题讨论】:

  • 完全不清楚你在问什么。是的,如果给接口添加方法,则需要给所有实现该接口的类添加实现。
  • 如果你以后有添加新方法的场景,你应该考虑改用抽象类,这样你就不需要每次都改变所有的类。
  • 也许创建一个 IExtendedMessage 接口,它本身扩展了 IMessage。将您的 Foo 方法添加到 IExtendedMessage 接口,任何使用 IMessage 的代码都应该没问题。
  • 如果你编写了 100 个类都实现了 IMessage,然后你决定 IMessage 需要另一种方法,你要么是一个快速打字机,要么你的 100 个类不需要 foo() 方法跨度>

标签: java c# design-patterns


【解决方案1】:

Java 8 为接口引入了“默认”方法;这意味着您可以提供“默认”实现。这允许您扩展现有接口而无需调整所有实现类。

但是,如果您使用的是旧版本的 Java - 您成功了:那么您必须更新所有类。

希望最后的编辑:现代 IDE 能够为您生成这种“缺失”的方法;并且取决于“Foo()”应该做什么的复杂性......最终可能没有那么多工作。

但还有另一种选择:

您可以这样做,而不是向现有界面添加新方法

interface IMessageV2 extends IMessage {
   void Foo();
}

这使您可以为每个类决定是否要“更新”类以实现 IMessage IMessageV2。但是,当然,对于您更改为实现 IMessageV2 的那些类;您必须为该“新”接口中的任何新方法提供实现。

这种方法的缺点是迟早,您的客户端代码将不得不处理实现 V1、V2、V3 ……版本接口的对象。这也会变得很糟糕。

【讨论】:

    【解决方案2】:

    取决于

    在所有 100 个类中都需要这个新的void Foo() 方法吗?

    如果是,那么没有其他办法,这没有错。

    但是如果你想要一个类似的接口,但不希望这些类有变化,那就写另一个接口

    interface IMessageChild extends IMessage
    {
       void Foo();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2014-04-05
      • 2015-03-13
      • 1970-01-01
      • 2013-08-15
      • 2010-09-06
      相关资源
      最近更新 更多