【发布时间】:2011-05-25 22:25:56
【问题描述】:
我想创建一个事件调度系统,它具有(浅)事件层次结构,可以通过 EventObserver 的(浅)层次结构观察。我认为双重调度将允许各种事件和 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; }
};
(这都是在Double dispatch/multimethods in C++和Wikipedia article on double dispatch的引导下)
现在,当我调试双调度时,会调用派生 Event 类(例如 EventA)的 beObservedBy 方法,并使用派生 EventObserver 类,但调用的是 observe( BaseEvent* ) 函数而不是observe( EventA* )
我做错了吗?我尝试使用引用而不是指针,但没有得到爱。
【问题讨论】:
-
我决定在 BaseObserver 上使用一系列的 observe() 方法,并根据需要在特定的 Observers 上覆盖它们。我看看模板化 observe() 函数是否有帮助。
标签: c++ events double-dispatch