C++中接口与实现分离的技术(二)

2014-11-24 12:59:13 · 作者: · 浏览: 4
st m_lxTest;

void lxTest();
};

  lxImplement.cpp文件内容:

#include "lxImplement.h"

ClxImplement::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.h"

ClxExp::ClxExp()
{
m_pImpl = new ClxImplement;
}

ClxExp::~ClxExp()
{
if (m_pImpl)
delete m_pImpl;
}

void ClxExp::DoSomething()
{
m_pImpl->DoSomething();
}

但是,如果类ClxExp是另一个类的子类,而在类ClxExp中要调用基类的方法,那上面的方案就不行了。比如说,类ClxExp的基类是下面的样子:

class ClxInF
{
public:
ClxInF();
virtual ~ClxInF();

bool InitSet();

virtual void DoSomething();
};

  相应的类ClxExp的声明变成了如下的形式:

class ClxExp : public ClxInF
{
public:
ClxExp();
virtual ~ClxExp();

void DoSomething();

private:
ClxImplement *m_pImpl;
};

  现在,假设我们必须在类ClxExp的DoSomething()方法中根据InitSet()的返回值来确定是否执行操作。最简单的实现方法是把类ClxExp的DoSomething()方法改成下面的样子:

void ClxExp::DoSomething()
{
if (InitSet())
m_pImpl->DoSomething();
}

  可是如果这样的话,接口与实现就没有彻底的分离,因为实现细节被暴露到了接口类中。为了避免这种情况发生,我们就