2013-04-10 170 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