不要重复发明轮子: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

 

 ========未完待续,后面更精彩===========

 

相关文章
|
6天前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
42 6
|
2月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
66 16
|
2月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
67 5
|
4月前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
48 1
【C++】继承
|
5月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
121 11
|
5月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
80 1
|
5月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
71 1
|
5月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
40 0
|
5月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
67 0
|
5月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
67 0