java中的接口與C++的多繼承

JAVA接口含義

https://www.runoob.com/java/java-interfaces.html

Java中接口的作用

問題: 例如我定義了一個接口,但是我在繼承這個接口的類中還要寫接口的實現方法,那我不如直接就在這個類中寫實現方法豈不是更便捷,還省去了定義接口?

解答:
接口就是個招牌。比如說你今年放假出去杭州旅遊,玩了一上午,你也有點餓了,突然看到前面有個店子,上面掛着KFC,然後你就知道今天中飯有着落了。KFC就是接口,我們看到了這個接口,就知道這個店會賣炸雞腿(實現接口)。那麼爲神馬我們要去定義一個接口涅,這個店可以直接賣炸雞腿啊(直接寫實現方法),是的,這個店可以直接賣炸雞腿,但沒有掛KFC的招牌,我們就不能直接簡單粗暴的衝進去叫服務員給兩個炸雞腿了。要麼,我們就要進去問,你這裏賣不賣炸雞腿啊,賣不賣漢堡啊,賣不賣聖代啊(這就是反射)。很顯然,這樣一家家的問實在是非常麻煩(反射性能很差)。要麼,我們就要記住,中山路108號賣炸雞,黃山路45號賣炸雞(硬編碼),很顯然這樣我們要記住的很多很多東西(代碼量劇增),而且,如果有新的店賣炸雞腿,我們也不可能知道(不利於擴展)。

來源: https://www.zhihu.com/question/20111251/answer/16585393

比較正常的解釋是:

鏈接:https://www.zhihu.com/question/20111251/answer/14012223

“接口是個規範”,這句沒錯。“不如直接就在這個類中寫實現方法豈不是更便捷”,你怎麼保證這個接口就一個類去實現呢?如果多個類去實現同一個接口,程序怎麼知道他們是有關聯的呢?既然不是一個類去實現,那就是有很多地方有用到,大家需要統一標準。甚至有的編程語言(Object-C)已經不把接口叫 interface,直接叫 protocol。統一標準的目的,是大家都知道這個是做什麼的,但是具體不用知道具體怎麼做。比如說:我知道 Comparable 這個接口是用來比較兩個對象的,那麼如何去比較呢?數字有數字的比較方法,字符串有字符串的比較方法,學生(自己定義的類)也有自己的比較方法。然後,在另外一個負責對象排序(不一定是數字喔)的代碼裏面,肯定需要將兩個對象比較。這兩個對象是什麼類型呢?Object a,b?肯定不行,a > b 這樣的語法無法通過編譯。int a,b?也不行?一開始就說了,不一定是數字。…所以,Comparable 就來了。他告訴編譯器,a b 兩個對象都滿足 Comparable 接口,也就是他們是可以進行比較的。具體怎麼比較,這段程序不需要知道。所以,他需要一些具體的實現,Comparable 接口有一個方法,叫 compareTo。那麼這個方法就是用來取代 <、> 這樣的運算符。因爲運算符是編譯器保留給內置類型(整數、浮點數)進行比較用的,而不是一個廣義的比較運算。

JAVA接口摒棄C++多繼承的壞處?

詳見這個問題: https://www.zhihu.com/question/31377101

C++如何實現接口呢?

C++中是沒有接口這個概念的,但C++中有抽象類(帶有純虛函數的一個類實現)作爲基類,用它來實現接口.
抽象類同樣不能有實例,只能依靠繼承進行對純虛函數的實例化.且繼承的時候用虛繼承,保證出現多繼承時只有一個實例.
eg:

struct Ia 
{    virtual ~Ia() = default;    
	 virtual void method() = 0;
};

class B : public virtual Ia 
{
	public:    void method() override;
};

void B::method(){/*...*/}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章