多并行接口的实现

时间:2017-03-01 17:26:34

标签: java

假设我将接口定义为:

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的对象时,它从TestInterface1TestInterface2得到方法?

2 个答案:

答案 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任何类都可以访问此默认方法,这可能不是您想要的。