为什么Java的接口扩展接口(Java why interface extends interfac

2019-07-03 21:59发布

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

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(){}
}

是否有任何显著背后的原因?

Answer 1:

该显著的原因完全取决于什么接口应该做的。

如果你有一个接口,车辆和驱动的接口按理说,所有的车辆都被驱动。 如果没有接口继承每一个不同类型的汽车类将需要

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

而不必去想它。



Answer 2:

是的,有:它就像继承其他任何地方。 如果B A 特例那么它应该写成这样。 第二个指示类恰好实现与他们没有任何关系2个接口。

从最终结果的角度来看,你可以只使用多个接口的地方的处理层次结构(就像你能避免在类层次使用继承的行为)。 这将使信息比较分散,但是,和(如果不是更多)显著它混淆了软件模型的意图。



Answer 3:

是的,有一个很大的区别。

在你的第一个例子,你的新界面B1被定义为从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到扩展,所以上面的代码是行不通的。 当您尝试(第二类)C的实例分配到用于参考,它会抱怨,因为你还没有告诉编译器,“所有B的是真是的。” (即,存在没有关系BC



Answer 4:

如果你不希望没有实现,你可以对实现B没有B扩展A.

例:

interface LivingThing{
public void eat();
}

interface Dog extends LivingThing{
public void Bark();
}

它可以是一个livingThing没有被一只狗,但它不可能是狗没有作为一个livingThing。 所以,如果它吠叫,还可以吃,但相反的是并非总是如此。



Answer 5:

你所说的是对的,但它并不只是让我们的工作完成后,如果有什么的要求是这样的:

1)试想一下,有10个接口,而不是设计成在同一时间。 比如,对于Java 7中的AutoCloseable界面添加了一个新的自动关闭功能,它是不存在,直到Java 6中。

2)如果你设计了一个C接口是一个标记接口,你想从一个给定的B类派生的所有类被标记,最好的解决办法是使用B扩展C和不打算,并把农具Ç无处不在。

还有更多的原因。 如果你看一下类和层次结构的大局观,你可能会得到自己的答案。

乐于帮助Dharam



Answer 6:

这里的主要区别是,在你的第一个例子B是A,然后一些。 这意味着接口B调用方法1()和method2(),其中如在第二A和B之一是分开的(接口B不结束方法1())和C类实现A和B在这两个intances C类将覆盖方法1 ()和method2()。 我希望这有帮助!



Answer 7:

有只在一个评论

interface A{
    public void method1();
}
interface B extends A{
    public void method2();
}
class C implements B{
    @Override public void method1(){}
    @Override public void method2(){}
}

如果声明一个一个新= C();

你不能调用方法2(); 因为接口一个一无所知的界面B1的元素,即使你实现了C类方法



文章来源: Java why interface extends interface