“界面”使用的情况

现有一基础模块A,提供模块间通信服务。类B、C中都有一个私有A*成员用于与其他模块之间通信,B、C的构造函数要求提供一个A的指针来初始化该私有成员。使用B的开发人员在平台W1上开发程序P1,具有A的A1实现版本;使用C的开发人员在平台W2上开发程序P2,具有A的A2实现版本;P1,P2进行通信。现在来看看A的界面如何使用:

对于A的设计者,给出A的界面接口规范A.h向所有驱动厂商、用户提供;并且给出了W1平台的实现A1.h,A1.cpp,其中A1中有派生类A1 : public A,并在A1.cpp中给出了全部接口实现;编译出A1库,并且向客户提供头文件A1.h;

类B为使用A,在B的接口规范B.h中包含A.h,定义A*私有成员,并通过构造函数获得一个A*;B.cpp的所有实现都对A*进行操作。
类C也是这样。

开发P1的程序员在自己定义的模块中需要包含B.h来使用B,其所在的W1中使用的是A的A1版本,故在头文件中应该:
cpp 代码
 
  1. ////P1.h  
  2. #include "B.h"  
  3. #include "A1.h"  
  4.   
  5. A1* a1ptr = new A1(...);  
  6. B  b(a1ptr);  
  7. b.fun()  
  8. ...  
而开发P2的程序员,首先根据A.h开发自己的A的实现A2.h, A2.cpp,然后在自己的模块中使用A2:
cpp 代码
 
  1. ////P2.h    
  2.  #include "C.h"    
  3.  #include "A2.h"    
  4.      
  5.  A2* a2ptr = new A2(...);    
  6.  C  c(a2ptr);    
  7.  c.fun()    
  8.  ...   

这样,A的开发人员可以根据不同环境,开发不同的驱动版本A1, A2, ....;而这些A的不同实现,并不影响B、C的设计和实现人员;P1、P2的开发人员可以根据自己实际需要选择A的不同实现(或者根据A.h自己再开发),而应用B,C。

另外一个好处是更换A的驱动,并不需要重新编译B、C,只需要重新编译P1,P2,并重新链接B、C即可。结构如下图:

带箭头的线表示继承关系,带实心球的线表示包含关系。

你可能感兴趣的:(C++,c,C#)