2014年3月5日 星期三

c++的interface

最近和朋友一起看Design Pattern的書,選定的書本,是使用C#來實作。
而C#又是一種學java的語言,有interface這種C++沒有的東西。
心中浮現了一個問題,在C++中,要怎麼表達,才會最最最最貼切interface呢??
不知道有在使用C++的朋友怎麼做呢?

在此,我介紹一下我自己的想法。

先來看看一個例子(c#)
interface ICloneable
{
Object^ Clone();
}
有幾個使用interface上的規則要注意:
  1. 要被繼承,不可以自己成為物件
  2. 繼承後要實作interface裡的function
  3. function權限預設公開
常見的C++實作,都是使用像下面這樣的做法滿足[1]
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++][筆記]介面實作

沒有留言:

張貼留言