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)
而不必考虑它.
Mat*_*ple 12
是的,它就像在任何其他地方继承一样.如果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();
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
| 归档时间: |
|
| 查看次数: |
31107 次 |
| 最近记录: |