Java为什么接口扩展接口

时间:2012-11-18 03:16:24

标签: java inheritance interface extends

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

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

背后有什么重大原因吗?

8 个答案:

答案 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的。” (即BC

之间没有关系

答案 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。 如果ACar,而BSportCar,则您可能只想使用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中的元素