ss ClassA;//只声明,在接口中只要知道有这些类,而在实现中才去include这些头文件
class ClassB;
class ClassD{
public:
virtual ~ClassD(){}
virtual int getA() const = 0;//函数来返回实现类中的数据成员
virtual double getB() const = 0;
virtual double getD() const = 0;
static ClassD* makeClassD(const ClassA& xa,const ClassB& xb);//这里使用静态成员来返回
};
再写一个派生类来实现CLassD的功能,RealClassD.h:
#include "ClassA.h"
#include "ClassB.h"
#include "ClassD.h"
class RealClassD:public ClassD{
public:
RealClassD(const ClassA& xa,const ClassB& xb):A(xa),B(xb),D(B.getB() + A.getA()){}
virtual ~RealClassD(){}
int getA() const;
double getB() const ;
double getD() const;
private:
ClassA A;
ClassB B;
ClassB D;
};而在这个派生类定义中,顺带实现ClassD中的返回指针的makeClassD的函数。这里:先从协议类中继承接口规范,然后在实现中实现接口中的函数。
#include "RealClassD.h"
int RealClassD::getA() const{
return A.getA();
}
double RealClassD::getB() const{
return B.getB();
};
double RealClassD::getD() const{
return D.getB();
}
ClassD* ClassD::makeClassD(const ClassA& xa,const ClassB& xb){
return new RealClassD(xa,xb);
}
而在需要使用的地方,如此调用这个函数来指向需要的接口:
ClassD* dd = ClassD::makeClassD(a,b);
cout<
getD()<
dd的指针动态绑定到返回的派生类对象,而在派生类中修改其实现的成员只要重新编译派生类的cpp就行了。
句柄类和协议类分离了接口与实现,从而降低了文件间的依赖性,当一定程度上有时间和空间上的消耗。对于一个程序转变为产品时,要用具体的类来取代句柄类和协议类。