[英]Java why interface 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(){}
}
是不是相当于
interface A{
public void method1();
}
interface B{
public void method2();
}
class C implements A, B{
@Override public void method1(){}
@Override public void method2(){}
}
背后有什么重要的原因吗?
重要原因完全取决于界面应该做什么。
如果你有一个接口 Vehicle 和一个接口 Drivable ,那么所有的车辆都是可以驾驶的。 如果没有接口继承,每种不同类型的汽车类都将需要
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 个接口,它们之间没有任何关系。
从最终结果的角度来看,您可以只使用多个接口来代替处理层次结构(就像您可以避免在类层次结构中使用继承行为一样)。 然而,这会使信息更加分散,并且(如果不是更多的话)显着地混淆了软件模型的意图。
是的,有一个很大的不同。
在您的第一个示例中,您的新接口 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
之间没有关系)
里面只有一个评论
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();
因为接口A
对接口B
中的元素一无所知,即使您实现了类C
中的方法
如果你不想在不实现 A 的情况下实现 B,你可以让 B 扩展 A。
例子:
interface LivingThing{
public void eat();
}
interface Dog extends LivingThing{
public void Bark();
}
成为活物而不是狗是可能的,但不可能成为狗而不是活物。 因此,如果它能吠叫,它也能吃东西,但事实并非总是如此。
有时,您不想允许自己是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()
),它会失去从继承中获得的优势。
你说的是对的,但这不仅仅是为了完成我们的工作,如果需求是这样的呢:
1)假设有10个接口,不是同时设计的。 例如 Java 7 中的 AutoCloseable 接口。添加了一个新的自动关闭功能,直到 Java 6 才出现。
2) 如果您设计了一个接口 C,它是一个标记接口,并且您希望从给定类 B 派生的所有类都被标记,那么最好的解决方案是使用 B extends C,而不是将实现 C 放在任何地方。
还有更多的原因。 如果您查看类和层次结构的大图,您可能会自己得到答案。
乐于帮助达拉姆
这里的主要区别在于,在您的第一个示例中,B 是 A,然后是一些。 这意味着接口 B 调用方法 1() 和方法 2(),在第二个接口中,A 和 B 是分开的(接口 B 不包含方法 1()),类 C 实现 A 和 B。在这两种情况下,类 C 都将覆盖方法 1 () 和方法 2()。 我希望这有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.