我想实现双重调度。 说我有这样的课程:
class Entity
{
public:
virtual void eventHandler(Message* msg, Entity* entity);
}
然后我最终创建派生实体。假设我最终创建了几个派生自Entity的不同类型。我是否需要在Entity.hpp中转发声明它们然后为每个声明方法?如果我的班级名称发生变化,似乎会增加维护费用呢?
我想知道的另一件事是我是否需要在每个班级重新实施每一个。
Say Player需要响应Item的事件处理程序。这是否意味着我需要为所有其他实现提供空实现?
由于
答案 0 :(得分:2)
在双重调度中,你有两个类层次结构,A和B.A有一堆重载方法,它们采用不同版本的B,B有一个方法,它采用A.这些方法中的每一个都需要一个参数。您需要在A基类中声明所有不同的版本,并在A派生类中实现所有这些版本。您还需要在每个B派生类中重新实现B方法。是的,这意味着A事先了解每个B版本。
假设您有3条具体消息,一条KeyboardMessage,一条MouseMessage和一条ScreenMessage。你也有一个不断增长的实体家族,此时它由一个小工具和一个小工具组成。在类似C ++的伪代码中
class Message { virtual void dispatch(Entity* e) = 0 }
class KeyboardMessage : Message { void dispatch(Entity* e) { e->process(this); }}
class MouseMessage : Message { void dispatch(Entity* e) { e->process(this); }}
class ScreenMessage : Message { void dispatch(Entity* e) { e->process(this); }}
class Entity
{
virtual void process (KeyboardMessage* m) {... default impl...}
virtual void process (MouseMessage* m) {... default impl...}
virtual void process (ScreenMessage* m) {... default impl...}
}
class Widget : Entity
{
void process (KeyboardMessage* m) {... impl...}
void process (MouseMessage* m) {... impl...}
void process (ScreenMessage* m) {... impl...}
}
class Gadget : Entity
{
void process (KeyboardMessage* m) {... impl...}
void process (MouseMessage* m) {... impl...}
void process (ScreenMessage* m) {... impl...}
}
现在您可以轻松添加其他具体实体。要添加另一条消息,您必须向Entity添加一个方法,可能在某些派生类中重新实现它,但重新编译所有派生的(因为基础已更改)。
看,这里没有演员表。