Я ищу мнения о лучшем ОО способе выполнить то, что я собираюсь описать. Я пишу, что станет системой событий для игр и тому подобного, и я хочу, чтобы она была как можно более расширяемой, так как в ней много абстрактных классов. Два из них — это мониторы, которые назначены для мониторинга одного события, и обратные вызовы, которые оборачивают указатель функции, который будет вызван в случае события. Проблема возникает, когда я хочу отправить данные, которые нужны для обратного вызова. Данные, которые будут отправлены, будут зависеть от подкласса (в зависимости от сигнатуры функции) и храниться в подклассовом мониторе. Я хочу иметь возможность передавать эти данные в обратный вызов перед вызовом execute, но, поскольку все является абстрактным с точки зрения монитора, это сложно. Я ищу предложения о том, как сделать это наилучшим из возможных способов, пока еще я не придумал ничего, что мне бы слишком понравилось. Поскольку обратные вызовы отправляются другому классу для фактической отправки, данные должны в какой-то момент оказаться внутри них.
Для справки, монитор абстрактного класса
#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;
};
Любые мнения и предложения приветствуются. Спасибо!
Если я вас правильно понял, эти данные должны быть переданы в конструктор обратного вызова. Предположим, у вас есть 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()
,
Других решений пока нет …