2012-03-10 9 views
1

ポリシーを実装するときは、特定のインターフェイスに従う必要があります。私が理解していることから、ポリシーはお互いを置き換えることができなければなりません。最近のC++の本では、Ch 1.5ポリシーは同じインタフェース "T * Create(){}"を持っています。なぜそれを抽象化する必要はありません。ポリシーに必要なインターフェイスが多数ある場合は重要です。私は、抽象クラスが具体的なクラス(ポリシークラス)内にあるべきレシピを提供することを理解しています。 Wikipedia exampleでは、 "使用する"はポリシーが持つべきインタフェースを定義しますが、抽象クラスではありません。抽象クラスのポイントは、派生クラスに必要なインターフェイスがあることを確認するものではありませんか?ポリシーを抽象化してみませんか?

私は何が欠けていますか?

答えて

2

抽象基底クラスを使用するインタフェースが、実行時多型を提供する仮想関数を持つ点が異なります。

このポリシーは、テンプレートのコンパイル時に多態性を提供するために使用されます。コンパイラは、ポリシークラスがT* Create()かどうかを確認します。そうでない場合は、使用しようとするとコンパイル時エラーが発生します。

1

私は実際にはポリシーベースのデザインを実際に使ったことはありません。それはC++でコーディングして以来の年ですが、ここに私の解釈があります。あなたが指摘したように、ホストクラスは、インタフェースを使って、またはのようなものを使って、wikiの例で示されているように、使用されているポリシーに制約を強制することができます。

使用方法の利点(または相違点)は、ポリシーが使用するコードによって直接表される暗黙的な契約を持つため、事前の制限が少なく、厳格性が低いことです。 usingの例では、output_policy実装はPrintというメソッドを実装するだけで、何も返さず、language_policy :: Message()が返すものをすべて取ります(この場合、すべてのlanguage_policiesがstd :: stringを返します) 。これはアヒルのタイピングにもう少し近いです。

1つの欠点は、コードがなくなると暗黙の契約が消えることです。別の欠点は、ポリシーが互いにある程度の依存関係を持つことです。非常に工夫された例として、output_policyに文字列だけを出力するnon-generic Printメソッドがある場合、整数だけを出力するlanguage_policyでは使用できません。

なぜ必要な場合にポリシーインターフェースを追加できないのかわかりません。 1つの例は、HelloWorldクラスがoutput_policyを文字列とそれ以外のものを出力するように制約したい場合です。これを実現するには、以下のようなコードを書くことができます。output_policy<std::string>が実際にOutputPolicyInterface<std::string>を実装するようにSFINAEを使用する必要があることに注意してください。

template<typename message_type> 
class OutputPolicyInterface 
{ 
    virtual void Print(message_type message) = 0; 
}; 


template <template<class> class output_policy, typename language_policy> 
class HelloWorld : public output_policy<std::string>, public language_policy 
{ 

public: 
    void Run() 
    { 
     Print(Message()); 
     //Print(2); won't work anymore 
    } 
}; 
関連する問題