我想创建一个具有事件(浅)层次结构的事件调度系统,可以通过 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++ 中的 Double dispatch/multimethods和Wikipedia article on double dispatch)
现在当我调试双重调度时,调用beObservedBy
了派生Event类(EventA
比如说)的方法,并使用了派生EventObserver类,但是observe( BaseEvent* )
调用的是函数而不是observe( EventA* )
我做错了吗?我尝试使用引用而不是指针,但没有得到爱。