而C#又是一種學java的語言,有interface這種C++沒有的東西。
心中浮現了一個問題,在C++中,要怎麼表達,才會最最最最貼切interface呢??
不知道有在使用C++的朋友怎麼做呢?
在此,我介紹一下我自己的想法。
先來看看一個例子(c#)
interface ICloneable
{
Object^ Clone();
}
有幾個使用interface上的規則要注意:- 要被繼承,不可以自己成為物件
- 繼承後要實作interface裡的function
- function權限預設公開
class ICloneable
{
public:
Object* Clone() = 0;
}
利用純虛擬的特性,強迫「被繼承」以及「衍生類別必實作其function」。但是,使用C#與java的朋友知道,虛擬類別與interface的差別在於
interface就是預計被繼承的member function介面集合(繼承介面的衍生類別,一定要實作該介面的member function。)interface沒有member var。
嗯~~回過頭看看C++的實作,似乎滿足上面的樣子,但是總是無法區分純虛擬與interface,那怎麼辦呢?
再回去看看上面interface的規則要注意的三點,其第三點,我們尚未滿足。
看到這,你可能會問「怎麼會?我們有加 public: 呀!不就公開其權限了??」
嘖嘖嘖,會這樣反駁者,一定沒有仔細看描述
3. function權限預設公開
看到這,心裡應該有底了吧?
我們來實作看看,什麼叫做預設公開的....interface
struct ICloneable
{
Object* Clone() = 0;
}
發現了嗎?我們利用了struct的特性,讓它裡面只裝虛擬函式。這樣就和純虛擬類別區分開來了,並且預設公開。一般struct的用法是不放function,但是事實上,用法和class一模一樣,並沒有太多限制,所以可以這樣使用達到既與一般的struct不同,也和純虛擬函數不同,來達到interface的作用。最後,如果真的要實實在在的實作出一模一樣的程式,也不是不可能的,最後一個例子,就給程式碼語法狂熱愛好者看看,這樣做就可以滿足程式碼的美感與力度。
typedef struct interface
interface ICloneable
{
Object* Clone() = 0;
}
追求程式碼表現的美,還真的需要一點狂熱!哈哈~~
參考資料:
[1] [C++][筆記]介面實作
沒有留言:
張貼留言
(什麼是留言欄訊息?)