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

Если я правильно вас понял, эти данные должны быть предоставлены конструктору обратного вызова. Предположим, у вас есть Callback1 и Callback2, полученных от DIVE_GUI_Callback. Таким образом, код может выглядеть следующим образом:

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

Эти конкретные данные затем будут использованы в Excecute_Callback().

+0

Проблема заключается в том, что данные необходимо обновлять по существу в каждом кадре, если только обратный вызов не ссылался на все его переданные в конструкторе, я полагаю. Я не уверен, насколько хорош дизайн. – Pat

+0

@Pat: в этом случае он должен быть передан 'Excecute_Callback()' или Callback должен иметь возможность запрашивать эти данные –

Смежные вопросы