我想知道在什么情况下我们从接口扩展接口?因为,例如
interface A{
public void method1();
}
interface B extends A{
public void method2();
}
class C implements B{
@Override public void method1(){}
@Override public void method2(){}
}
不等同于
interface A{
public void method1();
}
interface B{
public void method2();
}
class C implements A, B{
@Override public void method1(){}
@Override public void method2(){}
}
背后有什么重大原因吗?
答案 0 :(得分:50)
重要原因完全取决于界面应该做什么。
如果你有一个界面车辆和一个可驱动的接口,那么所有车辆都是可驾驶的。没有接口继承,每种不同类型的汽车类都需要
class ChevyVolt implements Vehicle, Drivable
class FordEscort implements Vehicle, Drivable
class ToyotaPrius implements Vehicle, Drivable
等等。
就像我说的所有车辆都是可驾驶的,因此更容易拥有:
class ChevyVolt implements Vehicle
class FordEscort implements Vehicle
class ToyotaPrius implements Vehicle
使用车辆如下:
interface Vehicle extends Drivable
而不必考虑它。
答案 1 :(得分:12)
是的:它就像继承其他地方一样。如果B 是A的特化,则应该以这种方式编写。第二个表明该类恰好实现了2个接口,它们之间没有任何关系。
从最终结果的角度来看,您可以使用多个接口代替处理层次结构(就像您可以避免在类层次结构中使用继承行为一样)。然而,这会使信息更加分散,并且(如果不是更多)显着地模糊了软件模型的意图。
答案 2 :(得分:5)
是的,有一个很大的区别。
在你的第一个例子中,你的新界面B被定义为从A扩展,所以继续,任何类实现B 自动实现A.基本上,你'告诉编译器“这里是A的意思,这就是B的意思,哦,顺便说一下,所有的B都是A的!”这可以让你说出......
class C implements B {
... you implement all of the methods you need...
...blah...
...blah...
}
A myNewA = new C();
并且工作正常。
但是,在第二个示例中,您没有声明B扩展A,因此上面的代码不起作用。当你试图将(第二种)C的实例分配给A的引用时,它会抱怨,因为你没有告诉编译器“所有的B都是A的。” (即B
和C
)
答案 3 :(得分:2)
如果您不希望在未实施A的情况下实施B,则可以使B扩展A。
示例:
interface LivingThing{
public void eat();
}
interface Dog extends LivingThing{
public void Bark();
}
有可能成为一个没有狗的生活,但如果没有生活,就不可能成为一只狗。因此,如果它可以吠叫它也可以吃,但相反的情况并非总是如此。
答案 4 :(得分:1)
你说的是对的,但这不仅仅是关于完成我们的工作,如果要求如下:
1)想象一下,有10个接口,不是同时设计的。对于例如Java 7中的AutoCloseable接口添加了一个新的自动关闭功能,直到Java 6才有。
2)如果您设计了一个接口C,它是一个标记接口,并且您希望标记从给定类B派生的所有类,那么最好的解决方案是使用B扩展C而不是去实现C无处不在。
还有很多原因。如果你看一下类和层次结构的大图,你可能会自己得到答案。
乐意帮助 Dharam
答案 5 :(得分:1)
有时候,您不想允许B
而不是A
,而是希望允许A
而不必一定是B
。
如果A
是Car
,而B
是SportCar
,则您可能只想使用Car
接口来处理一些流,但是有时需要更具体和明确使用SportCar
。这样,您将无法决定仅实施SportCar
的一天。它也迫使您实现Car
。这正是OOP中继承的含义。
此外,假设您要声明一个实现SportCar
的新类成员。您将如何实现Car
接口?据我所知,无法添加由多个接口组成的类型。
public SportCar myCar;
// public SportCar,Car myCar -> invalid
这样一来,您就不能保证myCar
会使用Car
的方法(例如Drive()
),从而失去了从继承中获得的优势。
答案 6 :(得分:0)
这里的主要区别在于,在你的第一个例子中,B是A,然后是一些。这意味着接口B调用method1()和method2(),其中第二个A和B是分开的(接口B没有结束method1()),类C实现A和B.在两个内部类C将覆盖method1 ()和method2()。我希望这有帮助!
答案 7 :(得分:0)
中只有一条评论
interface A{
public void method1();
}
interface B extends A{
public void method2();
}
class C implements B{
@Override public void method1(){}
@Override public void method2(){}
}
如果您声明A a = new C();
您不能调用method2();因为即使您在类C中实现方法,接口A也不了解接口B中的元素