2011-03-03 10 views
1

データセットに対して操作を実行するための一連の互換性のあるクラスが必要です。私がしようとしていることは多形性と呼ばれていますが、私は分かりません。どのように再帰的に別のクラスにアクセスするのですか?

これは私がやろうとしていることの例です。最初の値を含むオブジェクトを作成し、最初のクラスのデータを使用する別のクラスを初期化し、execを使用して操作を実行してから、別の再帰クラスでこれを繰り返します。

私は操作の順序を変更できるようにしたいと考えています。どのクラスもexec()を呼び出すことができ、常にunsigned longを返すことができます。 init()は異なるかもしれませんが、初期化中に呼び出され、再帰クラス内ではアクセスされません。 Chain of Responsibility:あなたは、次のデザインパターンをチェックしたい場合がありますように

おかげで、

class operationsObject { 
public: 
    virtual unsigned long exec (void) =0; 
}; 

class addObject: public operationsObject { 
private: 
    unsigned long valueA, valueB; 
public: 
    void init(unsigned long a, unsigned long b) 
    {valueA = a; valueB = b;} 
    unsigned long exec() 
    {return valueA + valueB;} 
}; 

class subtractObject: public operationsObject { 
private: 
    operationsObject *obj; 
    unsigned long valueA; 
public: 
    void init(unsigned long a, operationsObject *o) 
    {valueA = a; obj = o;} 
    unsigned long exec() 
    {return obj->exec() - valueA;} 
}; 

class multiplyObject: public operationsObject { 
private: 
    operationsObject *obj; 
    unsigned long valueA, valueB; 
public: 
    void init(unsigned long a, unsigned long b, operationsObject *o) 
    {valueA = a; valueB = b; obj = o;} 
    unsigned long exec() 
    {return obj->exec() * valueA * valueB;} 
}; 

int main(){ 
    operationsObject *op1 = new addObject; 
    operationsObject *op2 = new subtractObject; 
    operationsObject *op3 = new multiplyObject; 
    op1->init(4,5); 
    op2->init(4, op1); 
    op3->init(1, 2, op2); 
    unsigned retVal = op3->exec(); 
} 

答えて

3

は、あなたの説明が聞こえます。

私はおそらくこのような何かを思い付くしたい:

  • 抽象仮想メソッドを保護
  • を呼び出し
  • パブリックメソッドexec(非仮想!)とのコマンドインタフェース/抽象基底クラスexecLocalあなたが探している動作を実装します。

さて、execのように定義することができます:「正確に」どのように私はもともとそれを実装することを考えていましたが、この概念は、より理にかなっていない

def exec(param): 
    self.execLocal(param) 
    if self.hasNext(): 
     self.next.exec(param) 
+0

、私はこのサイトにhttp://sourcemaking.comを見つけました/ design_patterns/chain_of_responsibility/cpp/1は、C++での実装を説明しています。 – jeremyb

関連する問題