不要重复发明轮子:C++重用的5重境界(4)——继承接口DLL

发布时间:2014-10-25 2:22:16
来源:分享查询网

第四重境界:继承接口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。    ========未完待续,后面更精彩===========  

返回顶部
查看电脑版