一般に、この手法は言語構成体になる可能性がありますが、どのPLでも
いくつかのインターフェースがあるとします:
1)飛行可能
2)ひどい
3)アヒル
一部のタイプはこれらのインターフェースをすべて一度に実装し、一部のタイプはインターフェースの一部のみを実装します。 特定のメソッドが、飛ぶことができるオブジェクト(飛べる)と揺れることができるオブジェクト(quackable)でのみ機能することを示す方法
この問題については、「Design Patterns」という本(Bates B.、Sierra K.、Freeman E.、Freeman E.)で詳しく説明されています。 本自体へのリンク。 出版社のサイトには、インターフェースの分離の問題の詳細な説明を含む本の必要な断片があります。
パラメーターの数が異なる3つの特殊化を備えた次のテンプレートを提供します。
テンプレートの使用は次のように想定されています。
1)インターフェースのグループを実装するには:
2)メソッドパラメータに必要なインターフェイスをリストするには:
したがって、パラメータタイプは、オブジェクトが実装する必要があるインターフェイスを明示的にリストします。
上記のIGroupテンプレートクラスには1つの重大な欠点があります-型の列挙の順序は不可欠です。 この機能を排除するには、IGroup継承の階乗倍数と型数をリストする必要があります。 つまり、 Nの(N-1)の量で、タイプのすべての可能な組み合わせではなく、それらのさまざまな配置を示します。 (N-1)でNからの(N-1)オブジェクトの配置が可能! 組み合わせの数倍。
3つのパラメーターのサンプルコード:
完全なサンプルコードはこちら: http : //codepad.org/ONI6uXjI
もちろん、5番目と6番目のパラメーターを使用してIGroupのコードを手動で作成しないでください。この千行のコードを生成するにはスクリプトが必要です。 完全に使用するには、スマートポイントで十分な作業がありません。 先日試してみますが、「スマート」ポインターをキャストしても問題はないようです。
更新1:
コメント1と2で同志burdakovdとtangroが正しく指摘したように、Javaと.NETでは、このメカニズムのサポートはGenericsにあります。 Java Genericsおよび.NET Genericsの説明へのリンク。
更新2:
ユーザーsuslは、BoostライブラリにはBoost Concept Checkメカニズムがあることをコメントで正しく指摘しました。
更新3:
バルタザール同志は、新しいC ++ 0x標準の概念に関する状況 、またはむしろそれらの不在について明らかにしました 。 そして彼は、Boost Concept Checkプレゼンテーションのスライドへのリンクを提供しました。 彼に感謝します!