不要重複發明輪子: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