2013-04-10 72 views
0

我正在尋找關於最佳OO方式來實現我即將描述的內容的意見。我正在寫什麼將成爲遊戲之類的事件系統,我希望它儘可能地具有可擴展性,因爲有很多抽象類。其中兩個是分配監視一個事件的監視器,以及回調函數,如果該事件發生,則會封裝函數指針以進行調用。當我想發送回調需要的數據時就會出現問題。將發送的數據將是特定於子類的(取決於功能簽名)並存儲在子類監視器中。我希望能夠在調用execute之前將這些數據傳遞給回調函數,但是因爲從監視器的角度來看所有內容都是抽象的,所以這很困難。我正在尋找關於如何以最佳OO方式做到這一點的建議,因爲我還沒有拿出任何我喜歡的東西。由於回調被髮送到另一個類以實際發送,所以數據需要在某個時刻結束。在抽象類之間傳遞數據

作爲參考,在監視器抽象類

#pragma once 

#include "DIVE_GUI_Types.h" 
#include "DIVE_GUI_Callback.h" 
#include "DIVE_GUI_Event_Dispatcher.h" 
#include <map> 
#include <string> 

/* 
Class to monitor events to be handled by the event system. 
*/ 

class DIVE_GUI_Event_Monitor 
{ 
private: 
    friend class          DIVE_GUI_Kernel; 
    DIVE_GUI_Event_Dispatcher*       m_Dispatcher; 
    static DIVE_HANDLE         m_Active_GUI; 

protected: 
    const std::string         m_Event_ID; 
    std::map<DIVE_HANDLE, DIVE_GUI_Callback*>   m_GUI_Map; 
    virtual bool Dispatch() = 0; 

public: 
    void Update(); 
    std::string Get_Event_ID() const { return m_Event_ID; } 
    DIVE_GUI_Event_Monitor(const std::string& id) : m_Event_ID(id) { } 
    void Add_Callback(DIVE_HANDLE, DIVE_GUI_Callback* function); 
}; 

並且回調抽象類

#pragma once 

/* 
Abstract class representing a wrapper for a callback function as per the Command design  pattern. 
*/ 

class DIVE_GUI_Callback 
{ 
public: 
    virtual void Excecute_Callback() const = 0; 
}; 

任何和所有的意見/建議讚賞。謝謝!

回答

1

如果我正確理解你,這個數據應該被提供給回調構造函數。假設你有來自DIVE_GUI_CallbackCallback1Callback2。因此,代碼可能看起來像:

DIVE_GUI_Event_Monitor* monitor; 
monitor->Add_Callback(Callback1(specific_data_1)); 
monitor->Add_Callback(Callback2(specific_data_2)); 

這種特殊的數據,那麼將在Excecute_Callback()使用。

+0

這個問題是,數據需要基本上每一幀更新,除非回調引用的所有它傳遞給構造函數我想。我不確定這是一個多好的設計。 – Pat 2013-04-10 21:26:25

+0

@Pat:在這種情況下,它應該傳遞給'Excecute_Callback()'或Callback應該能夠請求這些數據 – 2013-04-10 21:43:09