Java为什么接口扩展接口

pet*_*ter 36 java inheritance extends interface

我想知道在什么情况下我们从接口扩展接口?因为,例如

interface A{
    public void method1();
}
interface B extends A{
    public void method2();
}
class C implements B{
    @Override public void method1(){}
    @Override public void method2(){}
}
Run Code Online (Sandbox Code Playgroud)

不等于

interface A{
    public void method1();
}
interface B{
    public void method2();     
}
class C implements A, B{
    @Override public void method1(){}
    @Override public void method2(){}
}
Run Code Online (Sandbox Code Playgroud)

背后有什么重大原因吗?

Spe*_*ort 58

重要原因完全取决于接口应该做什么.

如果你有一个界面车辆和一个可驱动的接口,那么所有车辆都是可驾驶的.没有接口继承,每种不同类型的汽车类都需要

class ChevyVolt implements Vehicle, Drivable
class FordEscort implements Vehicle, Drivable
class ToyotaPrius implements Vehicle, Drivable
Run Code Online (Sandbox Code Playgroud)

等等.

就像我说的所有车辆都是可驾驶的,因此更容易:

class ChevyVolt implements Vehicle
class FordEscort implements Vehicle
class ToyotaPrius implements Vehicle
Run Code Online (Sandbox Code Playgroud)

车辆如下:

interface Vehicle extends Drivable
Run Code Online (Sandbox Code Playgroud)

而不必考虑它.

  • 如果你赋予Vehicle接口扩展可编码块中的Drivable接口,那么对于新手来说不是很好. (2认同)

Mat*_*ple 12

是的,它就像在任何其他地方继承一样.如果B A的特化,则应该以这种方式编写.第二个表示该类恰好实现了2个接口,它们之间没有关系.

从最终结果的角度来看,您可以使用多个接口代替处理层次结构(就像您可以避免在类层次结构中使用继承行为一样).然而,这会使信息更加分散,并且(如果不是更多)显着地模糊了软件模型的意图.


Bob*_*ore 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();
Run Code Online (Sandbox Code Playgroud)

这很好.

但是,在第二个示例中,您没有声明B扩展A,因此上面的代码不起作用.当你试图将(第二种)C的实例分配给A的引用时,它会抱怨,因为你没有告诉编译器"所有B都是A的." (即B和之间没有关系C)


小智 5

只有一个评论

interface A{
    public void method1();
}
interface B extends A{
    public void method2();
}
class C implements B{
    @Override public void method1(){}
    @Override public void method2(){}
}
Run Code Online (Sandbox Code Playgroud)

如果你声明 A a = new C();

你不能调用method2();因为接口A对接口中的元素一无所知,B即使你在类中实现了方法C