15

テンプレート メソッド パターンのギャング オブ フォーから:

3 つの実装上の問題は注目に値します。

  1. C++ アクセス制御の使用。C++ では、テンプレート メソッドが呼び出すプリミティブ操作は、保護されたメンバーとして宣言できます。これにより、テンプレート メソッドによってのみ呼び出されるようになります。オーバーライドする必要があるプリミティブ操作は、純粋仮想として宣言されます。テンプレート メソッド自体はオーバーライドしないでください。したがって、テンプレート メソッドを非仮想メンバー関数にすることができます。

「これにより、テンプレートメソッドによってのみ呼び出されることが保証されます。」は真実ではありませんね。プリミティブ メソッド (一部が純粋仮想ではなく仮想の場合など) は、派生クラスからも呼び出すことができます。プリミティブ メソッドをプライベートに宣言するだけで、それらがテンプレート メソッドによってのみ呼び出されることが保証されるというのは本当ではないでしょうか? その後、プライベート仮想プリミティブ メソッドをサブクラスに実装 (または再実装) して、スーパークラスのテンプレート メソッドで定義されたアルゴリズム内で必要な特殊な動作を提供できます。

Herb Sutter の "Virtuality" を参照してください。

http://www.gotw.ca/publications/mill18.htm

彼は次のように述べています。

ガイドライン #2: 仮想機能を非公開にすることを優先します。ガイドライン #3: 派生クラスが仮想関数の基本実装を呼び出す必要がある場合にのみ、仮想関数を保護します。

派生クラスが仮想関数の基本クラスの実装を呼び出すための GoF テンプレート メソッド パターン内の要件が見当たりません。

4

1 に答える 1