Я хочу создать систему диспетчеризации событий с (мелкой) иерархией событий, которую может наблюдать (неглубокая) иерархия EventObservers.Я полагал, что двойная диспетчеризация позволила бы широкий спектр событий и EventObservers без необходимости иметь функцию для каждой отдельной комбинации.
У меня есть такой код:
class BaseObserver;
class BaseEvent {
public:
virtual std::string getName() { return "BaseEvent"; }
void beObservedBy( BaseObserver* obv );
};
class BaseObserver {
public:
virtual void observe( BaseEvent* evt ) {
std::cout << "BaseObserver observing: " << evt->getName() << "." << std::endl;
}
};
void BaseEvent::beObservedBy( BaseObserver* obv ) { obv->observe( this ); }
Затем определитенесколько тестовых классов:
class EventA : public BaseEvent {
public:
void beObservedBy( BaseObserver* obv ) { obv->observe( this ); }
virtual std::string getName() { return "I am an EventA"; }
};
class EventB : public BaseEvent {
public:
void beObservedBy( BaseObserver* obv ) { obv->observe( this ); }
virtual std::string getName() { return "I am an EventB"; }
};
class ObserverX : public BaseObserver {
virtual void observe( EventA* evt ) { std::cout << "ObserverX spotted an EventA" << std::endl; }
};
(Это все следовало примеру Двойная рассылка / мультиметоды в C ++ и статье Википедия о двойной рассылке )
Теперь, когда я отлаживаю двойную диспетчеризацию, вызывается метод beObservedBy
производного класса Event (скажем, EventA
), и используется производный класс EventObserver, но вызывается функция observe( BaseEvent* )
, а неobserve( EventA* )
Я делаю это неправильно?Я пытался использовать ссылки вместо указателей и не получил любви.