Передача данных между абстрактными классами

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

Любые мнения и предложения приветствуются. Спасибо!

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(),

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]