2011-03-03 11 views
1

我想有一組可交換的類來對數據集執行操作。我「認爲」我想做的事叫做多態,但我不確定。如何遞歸地訪問不同的類?

這是我想要做的一個例子。我想創建一個包含初始值的對象,然後初始化另一個類以使用第一個類中的數據並使用exec執行操作,然後用另一個遞歸類重複此操作。

我想要能夠改變操作的順序,這個想法是任何類都可以調用exec(),它總是會返回unsigned long。 init()可能會有所不同,但在初始化過程中被調用,並且不會在遞歸類中被訪問。

感謝,

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

你的描述聽起來像你可能想看看下面的設計模式:Chain of Responsibility

我可能會拿出這樣的:

  • 命令接口/抽象基類
  • 公共方法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 2011-03-03 09:18:43