質問

私は、特定のパラメータが握ることができる可能な値(実装二つの重要な方法、GetNumValues()とGetValueメソッド(INTインデックス))。表すことであるその目的はクラスパラメータは、持っている

4または8ではなく、いずれかよりも

多くの場合、1つの論理1又は2とすることができるパラメータ(パラメータ値がビットフラグである)最良パラメータ・クラスの2つの以上のインスタンスによって表される(すなわちAパラメータ、およびパラメータ5、6、9、または10)であることができるよりパラメーター。それを処理するために、私はパラメータが含まれているCompositeParameterクラスを作成したい、と(GetNumValuesを実装します)とパラメータの組み合わせに基づいて、GetValueメソッド()関数には、保持している。

そしてCompositeParameterがそれらを1つのパラメータとして機能持つようにパラメータを組み合わせているため、関係理にかなっている「CompositeParameterパラメータがあります」。私はちょうどいないようだ、それが継承するクラスのオブジェクトを、構成するクラスを持っている状況で自分自身を見つける私はそう。より高いレベルのコードがCompositeParametersとパラメータとまったく同じに扱うことができない理由しかし同時に、私は表示されません。

私は考えることができる唯一のオプションは、CompositeParameter単にコンのパラメータを持つことで、より高いレベルのコードは、CompositeParametersを扱うでしょう。しかし、それは多少無駄である一般的な場合、C B /ただ一つのパラメータを含んでいたCompositeParametersあろう。

思考?

class Parameter
{
public:
    virtual unsigned int GetNumValues() const {...}
    virtual unsigned int GetValue(unsigned int index) const {...}
}

class CompositeParameter : public Parameter
{
public:
    // product of GetNumValues() of each item in mParamList
    virtual unsigned int GetNumValues() const {...} 

    // allow all the possible combinations of the items in mParamList to be
    // treated as one parameter. i.e. if mNumParams = 2, this would be analogous
    // to getting the row and col index of a matrix from index, and combining
    // the mParamList[0]->GetValue(row) and mParamList[1]->GetValue(col)
    virtual unsigned int GetValue(unsigned int index) const {...}

private:

    static const unsigned int MAX_PARAMS = 10;

    unsigned int mNumParams;
    const Parameter* mParamList[MAX_PARAMS];
}
役に立ちましたか?

解決

I have a class which composes objects of a class it inherits from,
which just doesn't seem right.

という複合の定義ではないですか?

(parameter values are bit flags)

これは、私は疑問であろうと、デザインの一部です。おそらく、パラメータのためのより良い名前はFlagSetでしょうか?

それのインターフェイスの背後にあるビット単位のテストを非表示にするには、罰金が、それは基本的なコンピュータサイエンスではよく知られた解決策で問題を解決するためにやり過ぎかもしれない継承のように思える。

<時間>
However, that is somewhat wasteful b/c the general case would be
CompositeParameters which contained just one Parameter.

合成パターンの点は、リーフオブジェクトは、単純なケースを示し、複合オブジェクトは両方の場合に同じに扱うことができ、複雑な場合、クライアントのコードを表すことです。あなたのインターフェースは、基本クラスのコンポーネントを介して2つ、または反復を区別するためにクライアントコードが必要な場合は、その後、あなたは本当にパターンを使用してのうち、任意の値を取得していない。

あなたの主な関心事は、テストしている場合は、たとえば、その後、基底クラスはメソッドを持つことができます:

bool Test() const;

葉のクラスの実装は次のようになります。

bool LeafTester::Test() { return _DoTest(); }

複合クラスの実装は次のようになります。

bool CompositeTester::Test() {
    bool success = true;

    for (int i = 0; i < m_count; i++)
        success &= m_components[i].Test();

    return success;
}

とクライアントは、常にこのようなコードを使用します

// tester could be a Composite or a leaf, but we don't care:
bool testResult = tester.Test();

私は例をシンプルに保つためにforループを使用しました。実際に私の代わりにSTLを使用することになります。

他のヒント

これは完全に合理的な設計のように思えます。私はなるだろう唯一の変更は、インターフェイスにクラスからのパラメータを変更することです。

そして、あなたはパラメータのクラス(あるいはParameterImplクラス)を持っている可能性も実装パラメータ、およびまた、パラメータインタフェース

を実装CompositeParameterクラスを持っていること
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top