第四重境界:继承接口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{ //继承接口类,函数必须改写
//成员变量
…………………………………..
//继承的函数,需要重写。
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(){
void realizeclass::function3(){
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();
样例代码到这里就结束了,我们来总结一下这种方法的关键实现点:
1)实现类继承接口类,而不是“代理接口dll”中的接口类包含实现类的指针(uml中的聚合aggregation的一种实现方式);
2)由于第一条的存在,使得客户端不能直接new某个对象,所以要通过createinterfaceclass来创建一个具体的实现类。
3)由于第二条创建了实现类,为了避免内存泄漏,所以要deleteinterfaceclass。
========未完待续,后面更精彩===========