c++接口与实现以及分离技术.doc_第1页
c++接口与实现以及分离技术.doc_第2页
c++接口与实现以及分离技术.doc_第3页
c++接口与实现以及分离技术.doc_第4页
c++接口与实现以及分离技术.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

(1)什么是接口和实现以及区别请问类的实现是不是如下的解释: 用类定义一个对象,就像是int i; i就是int的实现一样,定义了就存在实际容量,那么定义的对象就是类的实现。 那么接口指的是什么? 请知道的高手好像实现的解释那样举个例子,说明一下!一般地,我们称C+类声明中的“函数原型”为接口,它只是提供给了用户如何使用的具体细节,而隐藏了具体的代码;类似地,我们称类的成员函数的具体的代码为实现。如下: class Test public: void test();/此处的成员函数void test()仅仅告诉告诉用户调用它时传递几个参数,以及它返回什么值,什么作用等,并没有告诉用户test()函数到底怎么完成这些功能的,这就是接口; ; void Test:test() ./这里是实现,此处是test()函数具体的代码,用户无需关心它是怎么写的。 又如: Test abc;/此处定义了一个Test类型的对象abc,abc 一般我们称之为类的“实例”(不是实现)。一个没有定义对象的类,只是一个“概念”,而不是一个实体,即实际存在的东西。类的作用只有在定义了类的实例(也就是类对象)后才会体现出来(静态函数和成员例外)。仍以int i;为例,int就好比是类(class),而i好比是类的实例。(2)接口和实现分离技术在用C+写要导出类的库时,我们经常只想暴露接口,而隐藏类的实现细节。也就是说我们提供的头文件里只提供要暴露的公共成员函数的声明,类的其他所有信息都不会在这个头文件里面显示出来。这个时候就要用到接口与实现分离的技术。下面用一个最简单的例子来说明。类ClxExp是我们要导出的类,其中有一个私有成员变量是ClxTest类的对象,各个文件内容如下:lxTest.h文件内容:class ClxTest public: ClxTest(); virtual ClxTest(); void DoSomething();lxTest.cpp文件内容:#include lxTest.h#include using namespace std;ClxTest:ClxTest()ClxTest:ClxTest()void ClxTest:DoSomething() cout Do something in class ClxTest! DoSomething();通过上面的方法就实现了类ClxExp的接口与实现的分离。请注意两个文件中的注释。类ClxExp里面声明的只是接口而已,而真正的实现细节被隐藏到了类ClxImplement里面。为了能在类ClxExp中使用类ClxImplement而不include头文件lxImplement.h,就必须有前置声明class ClxImplement,而且只能使用指向类ClxImplement对象的指针,否则就不能通过编译。在发布库文件的时候,我们只需给用户提供一个头文件lxExp.h就行了,不会暴露类ClxExp的任何实现细节。而且我们对类ClxTest的任何改动,都不需要再给用户更新头文件(当然,库文件是要更新的,但是这种情况下用户也不用重新编译!)。这样做还有一个好处就是,可以在分析阶段由系统分析员或者高级程序员来先把类的接口定义好,甚至可以把接口代码写好(例如上面修改后的lxExp.h文件和lxExp.cpp文件),而把类的具体实现交给其他程序员开发。上文还没有考虑到类与类之间的继承关系。下面我们就来具体的谈谈这个方面。还是以上面提到的那篇文章中的例子来说明。执行类:lxImplement.h文件内容:#include lxTest.hclass ClxImplement public: ClxImplement(); ClxImplement(); void DoSomething();private: ClxTest m_lxTest; void lxTest();lxImplement.cpp文件内容:#include lxImplement.hClxImplement:ClxImplement()ClxImplement:ClxImplement()void ClxImplement:lxTest() m_lxTest.DoSomething();void ClxImplement:DoSomething() lxTest();接口类:lxExp.h文件内容:/ 前置声明class ClxImplement;class ClxExp public: ClxExp(); virtual ClxExp();void DoSomething();private: / 声明一个类ClxImplement的指针,不需要知道类ClxImplement的定义 ClxImplement *m_pImpl;lxExp.cpp文件内容:/ 在这里包含类ClxImplement的定义头文件#include lxImplement.hClxExp:ClxExp() m_pImpl = new ClxImplement;ClxExp:ClxExp() if (m_pImpl) delete m_pImpl;void ClxExp:DoSomething() m_pImpl-DoSomething();但是,如果类ClxExp是另一个类的子类,而在类ClxExp中要调用基类的方法,那上面的方案就不行了。比如说,类ClxExp的基类是下面的样子:class ClxInFpublic: ClxInF(); virtual ClxInF(); bool InitSet(); virtual void DoSomething();相应的类ClxExp的声明变成了如下的形式:class ClxExp : public ClxInFpublic: ClxExp(); virtual ClxExp(); void DoSomething();private: ClxImplement *m_pImpl;现在,假设我们必须在类ClxExp的DoSomething()方法中根据InitSet()的返回值来确定是否执行操作。最简单的实现方法是把类ClxExp的DoSomething()方法改成下面的样子:void ClxExp:DoSomething() if (InitSet() m_pImpl-DoSomething();可是如果这样的话,接口与实现就没有彻底的分离,因为实现细节被暴露到了接口类中。为了避免这种情况发生,我们就必须把对基类ClxInF的方法InitSet()调用放到执行类ClxImplement当中。可是怎么在执行类ClxImplement当中调用接口类ClxExp的基类ClxInF的方法呢?其实很简单,因为类ClxExp是类ClxInF的子类,那么它也就继承了类ClxInF的方法,只要把类ClxExp的this指针传给类ClxImplement,就可以通过这个指针来调用类ClxExp的方法,当然也可以调用类ClxExp从基类ClxInF继承来的方法。下面是修改后的代码:lxImplement.h文件内容:#include lxTest.h/ 包含声明类ClxExp的头文件#include lxExp.hclass ClxImplement public: / 构造函数,传入类的ClxExp的指针 ClxImplement(ClxExp *plxExp); ClxImplement(); void DoSomething();private: ClxTest m_lxTest; / 定义一个类ClxExp的指针,可以通过该指针调用类ClxExp从基类继承下来的方法 ClxExp *m_plxExp; void lxTest();lxImplement.cpp文件内容:#include lxImplement.hClxImplement:ClxImplement(ClxExp *plxExp) m_plxExp = plxExp;ClxImplement:ClxImplement()void ClxImplement:lxTest() m_lxTest.DoSomething();void ClxImplement:DoSomething() if (m_plxExp-InitSet() lxTest();对于类ClxExp来说,只要修改一下它的构造函数就行了,其他都不用修改。ClxExp:ClxExp() m_pImpl = new ClxImplement(this);这样,我们就解决了前面所提到的问题。当然,也许有人会说,让类ClxImplement也从类ClxInF继承不是更简单吗?那样就可以在类ClxImple

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论