我想知道在什么情况下我们从一个接口扩展接口? 因为,例如
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(){}
}
是否有任何显著背后的原因?
该显著的原因完全取决于什么接口应该做的。
如果你有一个接口,车辆和驱动的接口按理说,所有的车辆都被驱动。 如果没有接口继承每一个不同类型的汽车类将需要
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
而不必去想它。
是的,有:它就像继承其他任何地方。 如果B 是 A 的特例那么它应该写成这样。 第二个指示类恰好实现与他们没有任何关系2个接口。
从最终结果的角度来看,你可以只使用多个接口的地方的处理层次结构(就像你能避免在类层次使用继承的行为)。 这将使信息比较分散,但是,和(如果不是更多)显著它混淆了软件模型的意图。
是的,有一个很大的区别。
在你的第一个例子,你的新界面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的是真是的。” (即,存在没有关系B
和C
)
如果你不希望没有实现,你可以对实现B没有B扩展A.
例:
interface LivingThing{
public void eat();
}
interface Dog extends LivingThing{
public void Bark();
}
它可以是一个livingThing没有被一只狗,但它不可能是狗没有作为一个livingThing。 所以,如果它吠叫,还可以吃,但相反的是并非总是如此。
你所说的是对的,但它并不只是让我们的工作完成后,如果有什么的要求是这样的:
1)试想一下,有10个接口,而不是设计成在同一时间。 比如,对于Java 7中的AutoCloseable界面添加了一个新的自动关闭功能,它是不存在,直到Java 6中。
2)如果你设计了一个C接口是一个标记接口,你想从一个给定的B类派生的所有类被标记,最好的解决办法是使用B扩展C和不打算,并把农具Ç无处不在。
还有更多的原因。 如果你看一下类和层次结构的大局观,你可能会得到自己的答案。
乐于帮助Dharam
这里的主要区别是,在你的第一个例子B是A,然后一些。 这意味着接口B调用方法1()和method2(),其中如在第二A和B之一是分开的(接口B不结束方法1())和C类实现A和B在这两个intances C类将覆盖方法1 ()和method2()。 我希望这有帮助!
有只在一个评论
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类方法