大多数面向对象程序设计都提倡封装:我们应该隐藏实现细节的类,尽可能减少对象之间的耦合。但在C ++(包括其他编译语言),我们还需要关心其他方面的设计。如何才能做到这一点呢?
一个普通类的例子:
#include "Engine.h"
#include "Gearbox.h"
#include "..."
#include "Wheels.h"
class Car
{
private:
Engine m_engine;
Gearbox m_gearbox;
Wheels m_wheels;
public:
Car() { }
virtual ~Car() { }
void drive() { }
private:
void checkInternals();
}
假设它的逻辑设计是不错的,那该类相关的物理设计方面的问题是什么?
第一:如果我们在Engine类中添加一个方法吗?不仅Car.cpp将必须重新编译(当然这是预期),调用Car的客户端也要重新编译。
第二:如果我们对Car类的Private域添加或修改方法,这样,客户端也必须重新编译。
对于小项目来说重新编译是可以的,但是对于大项目,编译的时间将会很长。对于使用Car的客户类真的要重新编译吗?可以使用下面的方法来避免编译:
class Engine;
class Gearbox;
class Wheels;
class Car
{
private:
std::unique_ptr<Engine> m_engine;
std::unique_ptr<Gearbox> m_gearbox;
std::unique_ptr<Wheels> m_wheels;
public:
Car();
virtual ~Car();
void drive();
private:
void checkInternals();
}
或者
class Car
{
private:
std::unique_ptr<class CarImpl> m_pImpl;
public:
Car();
virtual ~Car();
void drive();
// private methods 'moved' to source file...
}