C++思いつきをメモ。C++ではprivateなインターフェースを作ることができます。以下のような感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <iostream> class parent { public: void execute(){commonCode();internalInterface();} private: void commonCode(){std::cout() < < "Parent" << std::endl;} virtual void internalInterface(){}=0; }; class child : public parent { private: virtual void internalInterface(){std::cout << "child" << std::endl;} }; |
インターフェースと言うからには、接点は外部という既成概念がありそうですが、基底クラスと派生クラスの関係を類似クラスグループとして考える場合であっても、その間にインタフェースがあってよいと思います。いわば、内向きなインターフェースです。
internalInterface()は派生クラスに実装を任されている純粋仮想関数です。この関数は外部からコールできません。必ず基底クラスに呼び出しを実装する必要があります。上の例では、execute()関数をpublicにして、テンプレートメソッドパターンとほぼ同じ効能を得ようとする例です。commonCodeに書いてある共通のコードは派生クラスのインスタンスでも実行されますし、複数のインターフェースが存在しシーケンスがあるばあいはそれも基底クラスに記述できます。
execute()をオーバーライドできるようにすると厄介な問題になりそうですが、うまく使うと(共通化ができていない)既存コードとの併用なんかもできてしまいます。