閱讀939 返回首頁    go 小米 go 小米6


不要重複發明輪子:C++重用的5重境界(4)——繼承接口DLL

第四重境界:繼承接口DLL

看起來“代理接口DLL”已經能夠很好的完成任務了,但追求完美的你是否總覺得有的地方不夠優美呢?

關鍵就在於這部分:

InterfaceClass:: Function1(int param1, char param2 ){

    return m_pRealizeClass-> Function1(param1, param2 );

}

以上這段代碼是代理模式的一種實現方法,但也有它的不足之處:對於RealizeClass的函數,InterfaceClass都要寫一個函數,每個函數的寫法都是一樣的:

return m_pRealizeClass-> FunctionXXX(param1, param2 ……………..);

對於隻有幾個方法的類來說,這可能沒有什麼,但是如果RealizeClass類有幾十上百個方法,那InterfaceClass就有幾十上百個這樣類似的函數,看起來是不是很暈呢?

 

有沒有一種方法能夠不用寫這麼多的無聊的函數呢?有,這就是本章要介紹的“繼承接口DLL”。我們還是按照第三重境界的方法來解釋這個方法:

繼承:就是麵向對象的繼承概念

接口:就是Java中的Interface一個概念;

DLL:就是動態鏈接庫了:)

翻譯成一句話就是:DLL通過繼承的方法對外提供接口

 

如果你還記得第三重境界的實現方式,一對比就會發現,這兩個方法其實大同小異,關鍵就是具體的實現方式不一樣:一個通過代理模式,一個通過繼承方式。那麼我們就來看看這個繼承方式具體如何實現。

/*******************************DLL代碼聲明部分開始**********************/

class InterfaceClass{    //聲明接口類,無成員數據,隻有方法,這裏不用dllexport聲明,//為什麼呢,請自行查閱相關資料?

    public:

    void Function1(int param1, char param2 ) = 0 //聲明為純虛函數,子類必須改寫;

    void Function2(int param1 = 0 ;

    void Function3(bool param1, char param2 ) = 0 ;

}

 

class RealizeClass::public InterfaceClass{ //繼承接口類,函數必須改寫

       //成員變量

       …………………………………..

       //繼承的函數,需要重寫。

    public:

    void Function1(int param1, char param2 );

    void Function2(int param1 );

    void Function3(bool param1, char param2 ) ;

}

 

//這兩個函數是“繼承接口DLL”實現關鍵,後麵介紹為什麼。

extern InterfaceClass* g_InterfaceClassPtr ; //不要和下麵的extern混淆哈:)

extern “C” InterfaceClass* __decspec(dllexport)  CreateInterfaceClass();

extern “C” InterfaceClass* __decspec(dllexport)  DeleteInterfaceClass();

/******************************* DLL代碼聲明部分結束**********************/

 

/*******************************DLL代碼定義部分開始**********************/

void RealizeClass::Function1(){

       //函數具體實現,do what you want!!!

    ……………………………..

}

 

void RealizeClass::Function2(){

       //函數具體實現,do what you want!!!

    ……………………………..

}

 

void RealizeClass::Function3(){

       //函數具體實現,do what you want!!!

    ……………………………..

}

 

InterfaceClass* g_InterfaceClassPtr = NULL;

 

InterfaceClass* CreateInterfaceClass(){

   if(g_InterfaceClassPtr == NULL){

       g_InterfaceClassPtr = new RealizeClass(); //生成的是具體的類

}

 

return g_InterfaceClassPtr;

}

 

InterfaceClass* DeleteInterfaceClass(){

     delete g_InterfaceClassPtr;

     g_InterfaceClassPtr = NULL;

}

 

/*******************************DLL代碼定義部分結束**********************/

 

 

/***************************使用DLL的客戶端代碼********************/

InterfaceClass* pInterfaceClass = CreateInterfaceClass();

pInterfaceClass->Function1(param1, param2);

………………………………………………………

DeleteInterfaceClass();

/***************************使用DLL的客戶端代碼********************/

 

樣例代碼到這裏就結束了,我們來總結一下這種方法的關鍵實現點:

1)實現類繼承接口類,而不是“代理接口DLL”中的接口類包含實現類的指針(UML中的聚合Aggregation的一種實現方式);

2)由於第一條的存在,使得客戶端不能直接new某個對象,所以要通過CreateInterfaceClass來創建一個具體的實現類。

3)由於第二條創建了實現類,為了避免內存泄漏,所以要DeleteInterfaceClass

 

 ========未完待續,後麵更精彩===========

 

最後更新:2017-04-02 00:06:45

  上一篇:go 學好正則表達式兩個最重要的規則
  下一篇:go Windows XP遠程桌麵多用戶登陸實現