More C++ Idioms/パラメータ化された基本クラス(Parameterized Base Class)
表示
意図
[編集]ある特徴を再利用可能なモジュールとして切り出しておき、必要なときに与えられた型に組み合わせる。
別名
[編集]- 下からの混入(Mixin-from-below)
- パラメータ化された継承(Parameterized Inheritance)
動機
[編集]ある特徴は要求群から分離してテンプレートとして開発可能である。 例えば、オブジェクトの直列化(serialization)である。直列化は、あるアプリケーション中の多数のクラスが関連するかもしれない分野横断的な事柄である。そのような事柄は管理可能で再利用可能なモジュールに切り出し、必要なときに組み上げることが可能である。特徴を追加することによって、元の型への代入可能性が破綻しないため、型パラメータに対して IS-A(public 継承)か WAS-A(private 継承) の関係をもちたいということが別の動機となる。
解法とサンプルコード
[編集]template <class T>
class Serializable : public T, /// パラメータ化された基本クラス(Parameterized Base Class)イディオム
public ISerializable
{
public:
virtual int serialize (char *& buffer, size_t & buf_size)
{
if (sizeof (T) <= buf_size)
{
memcpy (buffer, this, sizeof (T));
buffer += sizeof (T);
buf_size -= sizeof (T);
return sizeof (T);
}
return ERROR;
}
};
Serializable <T> は ISerializable だけでなく T としてもポリモルフィックに利用可能である。