我有一个有两种方法的接口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.
答案 0 :(得分:4)
这取决于你需要做什么。如果method Three()
引入了从设计角度应该封装到另一个单元(例如接口或类)的功能,那么如果它的类似功能使用1,则使用2。
编辑: 还有一个选择:接口不能相互扩展,具体类可以同时实现它们,但是再次 - 取决于你需要什么
EDIT2:
编辑后,它仍然没有太大的区别。 Still类可以实现两个接口或一个仍然可以在两个类上使用多态分配。例如,如果class concreteA implements interfaceA
和clas concreteB implements interfaceB
或class 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)
一种方法是查看A
和B
之间的关系类型。
如果B
"是" A
,那么继续使用案例2会更有意义。
答案 4 :(得分:1)
这取决于您使用接口的内容。如果使用接口A的所有接口也使用接口B,那么您也可以使用案例1并将所有接口A除去。否则,没有理由重复代码。复制代码意味着如果你改变某些东西,你必须在任何地方改变它,而不是只改变一个地方。
答案 5 :(得分:1)
如果你有A并想要使用它,你可以去B扩展A.如果你只是因为重用方法声明而从A扩展B,那么你的具体类必须实现所有3种方法,这是一个缺点(不是当你只专注于B时,会有很多用途。