假设我将接口定义为:
public interface TestInterface1 {
public void add();
}
由A,B和C类实现。
现在我需要在C类中添加减法功能 ;为此我创建了一个新的接口TestInterface2
并将其实现到C类:
public interface TestInterface2 {
public void sub();
}
C类看起来像这样:
public class C implements TestInterface1, TestInterface2 {
public void add() {
System.out.println("I am in add");
}
public void sub() {
System.out.println("I am in Sub");
}
}
现在问题是C的实例已在数百个这样的地方使用:
TestInterface1 c = new C();
只有C类才会获得TestInterface1
的添加方法。
是否有任何方法或模式来实现C类中的接口,以便创建类C的对象时,它从TestInterface1
和TestInterface2
得到方法?
答案 0 :(得分:1)
如果你可以改变你的接口然后让TestInterface1扩展另一个接口,那么使用第一个接口创建的对象可以使用它的父方法。
public interface TestInterface1 extends TestInterface2{
public void add();
}
答案 1 :(得分:0)
在我们开始讨论之前,你必须考虑为什么你甚至都在使用接口。接口保证所有实例都使用相同的实现。如果你想让一个特定的类具有更具体的实现,那么这听起来更像是一个具体类的方法,而不是一个新的接口。
无论如何,我们可以讨论您的选择。其中一个更清洁,传达明确的意图;其他混乱的东西。
第一个选项 - 传达更明确的意图 - 是避免使用限制性更强的界面,而是使用TestInterface2
来表示您要使用的每个声明C
。
这意味着你要在任何想要使用它的地方写TestInterface2 c = new C();
。是的,您将在所有使用C
的地方进行更改,但鉴于您必须将方法专门附加到C
的实例,此选项最清晰。< / p>
如果您只是在C
中编写方法,这将是相同的方法。这两者之间确实没有区别,如果您在C
中编写仅属于C
的方法,我个人更愿意这样做。
第二个选项 - 使事情变得混乱并且还需要Java 8 - 是使用默认方法。这个需要你首先在界面中实现它......
public interface TestInterface {
default void sub() {
System.out.println("I am in sub!");
}
}
...但您可以稍后在课堂上覆盖它。这会使事情变得混乱,因为实现TestInterface
的任何类都可以访问此默认方法,这可能不是您想要的。