Я ищу мнения о лучшем способе 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;
};
Любые и все мнения/предложения приветствуются. Благодаря!
Проблема заключается в том, что данные необходимо обновлять по существу в каждом кадре, если только обратный вызов не ссылался на все его переданные в конструкторе, я полагаю. Я не уверен, насколько хорош дизайн. – Pat
@Pat: в этом случае он должен быть передан 'Excecute_Callback()' или Callback должен иметь возможность запрашивать эти данные –