Java接口如何模拟多重继承?
我正在阅读“The Java Tutorial”(第二次)。 我刚刚完成了关于Interfaces的一节,但仍不明白Java接口如何模拟多重继承。 有没有比书中的内容更清晰的解释?
假设你的域中有两种东西:卡车和厨房
卡车有一个driveTo()方法和Kitchens一个cook()方法。
现在假设泡利决定从货车背面卖掉比萨饼。 他想要一个他可以开车去()和做饭()的东西。
在C ++中,他会使用多重继承来做到这一点。
在Java中被认为太危险了,所以你可以继承一个主类,但是你可以从接口继承行为,这些接口是用于所有意图和目的的抽象类,没有字段或方法实现。
所以在Java中,我们倾向于使用委托实现多重继承:
泡利将一辆卡车分成一小部分,并在一个名为厨房的成员变量中为卡车增加了一个厨房。 他通过调用kitchen.cook()来实现Kitchen界面。
class PizzaTruck extends Truck implements Kitchen {
Kitchen kitchen;
public void cook(Food foodItem) {
kitchen.cook(foodItem);
}
}
他是一个快乐的人,因为他现在可以做这样的事情;
pizzaTruck.driveTo(beach);
pizzaTruck.cook(pizzaWithExtraAnchovies);
好吧,这个愚蠢的故事是为了说明它不是多重继承的模拟,它是真正的多重继承,但条件是只能继承契约,只能从被称为接口的空抽象基类继承。
(更新:随着缺省方法的出现,接口现在也可以提供一些被继承的行为)
您可能会感到困惑,因为您在本地查看多个继承,就一个类继承多个父代的实现细节而言。 这在Java中是不可能的(并且通常会导致在可能的语言中滥用)。
接口允许类型的多重继承,例如一class Waterfowl extends Bird implements Swimmer
可以被其他类使用,就好像它是Bird
,就好像它是一个Swimmer
。 这是多重继承的更深层含义:允许一个对象像它一样属于几个不相关的不同类。
这是通过java中的接口实现多重继承的一种方法。
要实现什么?
A类扩展B,C //这在Java中不可能直接使用,但可以间接实现。
class B{
public void getValueB(){}
}
class C{
public void getValueC(){}
}
interface cInterface{
public getValueC();
}
class cChild extends C implemets cInterface{
public getValueC(){
// implementation goes here, call the super class's getValueC();
}
}
// Below code is **like** class A extends B, C
class A extends B implements cInterface{
cInterface child = new cChild();
child.getValueC();
}
链接地址: http://www.djcxy.com/p/53939.html