修改由接口实现的所有类

时间:2015-03-24 16:13:05

标签: java c# design-patterns

假设我有一个像

这样的界面
interface IMessage
{
    void DoSomething();
    void DoAnother();
}

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

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

所以实现这个界面的其他100个类必须改变。
那么这里有什么问题吗?改变所有的clasess?我听说Open Close是可解决的,所以我使用了界面,但在那种情况下,逻辑是什么?

2 个答案:

答案 0 :(得分:4)

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

但是,如果您使用的是旧版本的Java - 您已将其钉住:那么您必须更新所有类。

希望最终编辑:现代IDE能够产生这样的"缺失"方法给你;并且取决于" Foo()"的复杂性。应该做的......最终可能没那么多工作。

但还有另一种选择:

您可以执行

,而不是向现有界面添加新方法
interface IMessageV2 extends IMessage {
   void Foo();
}

如果您想要更新&#34>,这可以让您决定每个课程。实现IMessage IMessageV2的类。但是,当然,对于那些为了实现IMessageV2而改变的类;你必须为那个" new"中的任何新方法提供一个实现。接口。

这种方法的缺点是迟早,您的客户端代码将不得不处理实现接口的V1,V2,V3,......版本的对象。这也可能变得讨厌。

答案 1 :(得分:1)

<强>取决于

在所有100个课程中是否需要这个新的void Foo()方法。?

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

但是如果你想要一个类似的界面但是不希望这些类进行更改,那么就编写另一个界面

interface IMessageChild extends IMessage
{
   void Foo();
}
相关问题