更多 C++ 习语/参数化基类
外观
将可重用模块中的某个方面抽象出来,并在需要时将其组合到给定类型中。
- 自下而上的混合
- 参数化继承
某个方面可以从需求中抽象出来,并作为模板开发(例如,对象序列化)。序列化是一个跨领域关注点,应用程序中的许多类/POD 类型可能具有此关注点。这种关注点可以在易于管理的可重用模块中抽象出来。通过添加一个方面,与原始类型的可替换性不会被破坏,因此另一个动机是与类型参数具有 IS-A(公有继承)或 WAS-A(私有继承)关系。
template <class T>
class Serializable : public T, /// Parameterized Base Class Idiom
public ISerializable
{
public:
Serializable (const T &t = T()) : T(t) {}
virtual int serialize (char *& buffer, size_t & buf_size) const
{
const size_t size = sizeof (T);
if (size > buf_size)
throw std::runtime_error("Insufficient memory!");
memcpy (buffer, static_cast<const T *>(this), size);
buffer += size;
buf_size -= size;
return size;
}
};
Serializable <T> 可以多态地用作 T 以及 ISerializable。上面的示例仅在 T 是没有指针的用户定义的 POD 类型时才正常工作。