第四重境界:继承接口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。
========未完待续,后面更精彩===========
分享到:
相关推荐
数据描述符(descriptor)和存取描述符均具有以下可选键值:当且仅当该属性的 conBgurable 为 true 时,该属性描述符才能够被改变,同时该属
不要再重复造轮子了,Hutool这款开源工具类库贼好使(csdn)————程序
———————————————— 版权声明:本文为CSDN博主「jbyyy、」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:...
————————————————————- 操作系统:Mac OS X EI Caption Python版本:2.7 IDE:Pycharm ————————————————————- 分析 接口是基于HTTP协议的,那么说白了,就是发起HTTP请求就...
很多时候,都听人家在说不要重复制造轮子,要站在巨人的肩膀上等....不过让我感到有点困惑的是,怎么样才叫做不要重复制造轮子?如何才能站在巨人的肩旁上?现在网络如此发达,资源如此丰富,开源社区也发展的很好。...
重新发明轮子这些是我遇到的一系列面试问题的集合,我被要求重新发明轮子。
自己造轮子:一款实用的Android广告栏实现过程2016-01-23 安卓应用频道 安卓应用频道(点击上方公众号,可快速关注)来源:dongjunkun链接:
小班科学——轮子.doc
在根据SGI-STL仿造轮在的过程中,学习c++和数据结构
52020——收藏资料.4需要几个轮子0.ppt
每家PLC厂商都有自己的通讯协议,三菱有MC、倍福有ADS,然而没有统一性的接口协议。 为适应每一家通讯,每一家设备商、MES和工厂等都需要针对每款产品开发相应的通讯接口。 OneConnectAPI为实现统一的接口,去适配...
决不重新发明轮子.docx
幼儿园大班教案——轮子变变变.pdf
通过这个程序,你可以轻松地与讯飞星火API建立连接,并实现与模型的交互。无论是简单的问答还是复杂的问题,它都能准确理解并给出满意的答案。而且,它还具备联系上下文的能力,能够更好地理解问题的语境,从而提供...
小班主题活动设计思路了——不起的轮子.docx
NULL 博文链接:https://changzhiwin.iteye.com/blog/505946
NULL 博文链接:https://basil1292.iteye.com/blog/459911
3jdk并发包 3.1多线程的团队协作:同步控制 3.2线程复用:线程池 3.3不要重复发明轮子:jdk的并发容器 3.4使用jmh进行性能测试 3.2线程复用:线程池 3.3不要重复发明轮子:JDK的并发容器 3.4使用JMH进行性能测试 ...
如何避免产品设计中的「生造方案」和「重新发明轮子」? .doc