Effective C++ 34(二)

2015-07-20 17:32:03 · 作者: · 浏览: 11
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就行了。
    


句柄类和协议类分离了接口与实现,从而降低了文件间的依赖性,当一定程度上有时间和空间上的消耗。对于一个程序转变为产品时,要用具体的类来取代句柄类和协议类。