假设我有一个像
这样的界面interface IMessage
{
void DoSomething();
void DoAnother();
}
让我们在一个大项目中说100个类实现了这个接口。但是,如果我向IMessage接口添加一个新方法,如Foo();
interface IMessage
{
void DoSomething();
void DoAnother();
void Foo();
}
所以实现这个界面的其他100个类必须改变。
那么这里有什么问题吗?改变所有的clasess?我听说Open Close是可解决的,所以我使用了界面,但在那种情况下,逻辑是什么?
答案 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();
}