У меня есть источник событий, который испускает события, и обработчики событий, которые обрабатывают события. Я могу расширить объект Event
для создания различных событий, таких как AlarmEvent
, и объект EventHandler
для создания AlarmEventHandler
. EventHandler
имеет функцию HandleEvent(Event &event)
. Это вызывает проблему для дочерних классов, которые могут иметь HandleEvent(AlarmEvent &event)
методы. Очевидно, что это две разные функции, поэтому здесь нет переопределения. Вместо этого мне нужно, чтобы HandleEvent
был переопределен дочерним классом.
Я полностью понимаю, проблема в том, что каждый EventHandler
имеет свою собственную подпись HandleEvent
, поэтому EventEmitter
всегда будет обрабатывать события с база EventHandler::HandleEvent
. Я подумал, что используя Event &event
в качестве пареметра для EventEmitter::Emit
, он узнает, с каким Event
он имеет дело, и выберет правильный метод.
Как мне сделать мой EventEmitter
вызов AlarmEventHandler::HandleEvent
вместо базового метода EventHandler::HandleEvent
?
// Example program
#include <iostream>
#include <string>
#include <vector>
// event types
class Event {};
class AlarmEvent : public Event {};
// event handler
class EventHandler {
public:
virtual void HandleEvent(Event event);
};
void EventHandler::HandleEvent(Event event){
std::cout << "Handle event " << std::endl;
}
// alarm event handler
class AlarmEventHandler : public EventHandler {
public:
void HandleEvent(AlarmEvent event);
};
void AlarmEventHandler::HandleEvent(AlarmEvent event){
std::cout << "Handle alarm event " << std::endl;
}
// event emitter
class Emitter {
public:
std::vector<EventHandler*> handlers;
void Emit(Event &event);
};
void Emitter::Emit(Event &event){
for(size_t i = 0; i < this->handlers.size(); i++){
this->handlers[i]->HandleEvent(event);
}
}
int main()
{
AlarmEventHandler handler;
AlarmEvent event;
Emitter emitter;
emitter.handlers.push_back(&handler);
// problem:
// Handle event printed instead of Handle alarm event
emitter.Emit(event);
}