3 回答

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊
假設(shè)您的域中有兩種東西:卡車和廚房
卡車具有driveTo()方法,而Kitchens具有cook()方法。
現(xiàn)在,假設(shè)Pauli決定從送貨卡車的后面出售比薩餅。他想要一種可以與drive()和cook()一起使用的東西。
在C ++中,他將使用多重繼承來做到這一點(diǎn)。
在Java中,這被認(rèn)為太危險(xiǎn)了,因此您可以從主類繼承,但是可以從接口“繼承”行為,這些行為對(duì)于所有意圖和目的都是抽象類,沒有字段或方法實(shí)現(xiàn)。
因此,在Java中,我們傾向于使用委托來實(shí)現(xiàn)多重繼承:
Pauli對(duì)卡車進(jìn)行了子類化,并在一個(gè)名為廚房的成員變量中為卡車添加了廚房。他通過調(diào)用kitchen.cook()實(shí)現(xiàn)了Kitchen接口。
class PizzaTruck extends Truck implements Kitchen {
Kitchen kitchen;
public void cook(Food foodItem) {
kitchen.cook(foodItem);
}
}
他是一個(gè)快樂的人,因?yàn)樗F(xiàn)在可以做類似的事情;
pizzaTruck.driveTo(beach);
pizzaTruck.cook(pizzaWithExtraAnchovies);
好的,這個(gè)愚蠢的故事是要說明它不是多重繼承的模擬,它是真正的多重繼承,但前提是您只能繼承協(xié)定,只能從稱為接口的空抽象基類繼承。

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊
您可能會(huì)感到困惑,因?yàn)槟诒镜夭榭炊鄠€(gè)繼承,就一個(gè)類而言,該類從多個(gè)父級(jí)繼承了實(shí)現(xiàn)細(xì)節(jié)。在Java中這是不可能的(并且在可能的情況下經(jīng)常導(dǎo)致語言濫用)。
接口允許類型的多重繼承,例如a class Waterfowl extends Bird implements Swimmer
可以被其他類當(dāng)作a Bird
和如同a使用Swimmer
。這是多重繼承的更深層含義:允許一個(gè)對(duì)象像它一次一樣屬于多個(gè)不相關(guān)的不同類。

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超8個(gè)贊
這是一種通過Java接口實(shí)現(xiàn)多重繼承的方法。
要實(shí)現(xiàn)什么?
類A擴(kuò)展了B,C // //在Java中這不可能直接實(shí)現(xiàn),但是可以間接實(shí)現(xiàn)。
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();
}
添加回答
舉報(bào)