Template Methodのインターフェースを抽象クラスにする
Template Methodはデザインパターンの中でも最も理解のしやすいメソッドであり、C++設計の基本となるものです。一般的にはTemplate Methodはインターフェースで提供されますが、ほとんど共通という処理を抜き出したときは抽象クラスで定義してみるとよいかと思います。
class TemplateObject { public: virtual void init(void); //ここを仮想関数にする。 virtual void exec(void) = 0; void tmpltMethod(void); }; class ConcreteObject : public TemplateObject { public: void init(void); void exec(void); };
TemplateMethod.cpp
void TemplateObject::init(void){ std::cout << "これは親クラスの初期化です"<< std::endl; } void TemplateObject::tmpltMethod(void){ init(); exec(); } void ConcreteObject::init(void){ TemplateObject::init(); std::cout << "これは子クラスの初期化つけたし処理です" << std::endl; } void ConcreteObject::exec(void){ std::cout << "これは子クラスの実行処理です"<< std::endl; }
cliant.cpp
TemplateObject *cTo; ConcreteObject cCo; cTo = &cCo; cTo->tmpltMethod();
このコードの実行結果は下記になります。
これは親クラスの初期化です
これは子クラスの初期化つけたし処理です
これは子クラスの実行処理です
これは子クラスの初期化つけたし処理です
これは子クラスの実行処理です
ほとんど変わらない処理の流れを抽出した場合には抽象クラスにしてしまってオーバーライドした関数、この場合はConcreteObject::init()の中で親クラスのinit()を呼んでしまえば処理の共通化が出来ます。実際のTemplate Methodの運用では以上のようなコードが良く出てくるのではないかなと思います。