java中接口扩展接口的优化

时间:2014-08-25 11:50:50

标签: java interface

我有一个有两种方法的接口A:

public interface A{
    method One();
    method Two();
}

interface B有两种选择:

案例1:

public interface B{
    method One();
    method Two();
    method Three();
}

案例2:

public interface B extends A{
    method Three();
}

有人能告诉我上述哪两种情况更好实施,为什么? 案例2的缺点是什么?

编辑:在界面B中,我需要接口A的两种方法。所以,我认为扩展会好得多。 有些类我需要方法一和二,我实现了接口A.我需要方法一,二和三,我实现接口B.

6 个答案:

答案 0 :(得分:4)

这取决于你需要做什么。如果method Three()引入了从设计角度应该封装到另一个单元(例如接口或类)的功能,那么如果它的类似功能使用1,则使用2。

编辑: 还有一个选择:接口不能相互扩展,具体类可以同时实现它们,但是再次 - 取决于你需要什么

EDIT2: 编辑后,它仍然没有太大的区别。 Still类可以实现两个接口或一个仍然可以在两个类上使用多态分配。例如,如果class concreteA implements interfaceAclas concreteB implements interfaceBclass concreteB implements interfaceA, interfaceB仍然可以InterfaceA classB = new concreteB();

答案 1 :(得分:4)

这取决于你的逻辑。考虑这两对接口:

interface House {
    int doorCount();
    int windowCount();
}

interface Automobile {
    int doorCount();
    int windowCount();
    int wheelCount();
}

没有一个正确的人会通过扩建房屋来获得Automobile,因为汽车不是带轮子的房子。

另一方面,在这样的情况下

interface House {
    int doorCount();
    int windowCount();
}

int Mansion extends House {
    int poolCount();
}

派生自House是有道理的,因为Mansion是一种House,具有"附加功能"。

答案 2 :(得分:1)

如果您使用案例1,并且您已经根据类型A编写了客户端代码,则它将无法使用实现B的类的实例,并且无法使用纯红色磁带原因:B在概念上是A的扩展,但在Java类型系统中建模为不同的类型。

示例:

static void existingMethod(A a) {
  ...work with a ...
}

class ImplB implements B { ... }

public static void main(String... args) {
   B b = new B();
   existingMethod(b); // compile error for Case 1; Case 2 compiles fine.
}

因此,让B类型扩展A会更有意义。

答案 3 :(得分:1)

一种方法是查看AB之间的关系类型。

如果B"是" A,那么继续使用案例2会更有意义。

答案 4 :(得分:1)

这取决于您使用接口的内容。如果使用接口A的所有接口也使用接口B,那么您也可以使用案例1并将所有接口A除去。否则,没有理由重复代码。复制代码意味着如果你改变某些东西,你必须在任何地方改变它,而不是只改变一个地方。

答案 5 :(得分:1)

如果你有A并想要使用它,你可以去B扩展A.如果你只是因为重用方法声明而从A扩展B,那么你的具体类必须实现所有3种方法,这是一个缺点(不是当你只专注于B时,会有很多用途。