在方法/函数重载中,是否必须重新实现每个版本?

时间:2011-06-19 00:26:35

标签: c++

我想实现双重调度。 说我有这样的课程:

class Entity
{
   public:
   virtual void eventHandler(Message* msg, Entity* entity);
}

然后我最终创建派生实体。假设我最终创建了几个派生自Entity的不同类型。我是否需要在Entity.hpp中转发声明它们然后为每个声明方法?如果我的班级名称发生变化,似乎会增加维护费用呢?

我想知道的另一件事是我是否需要在每个班级重新实施每一个。

Say Player需要响应Item的事件处理程序。这是否意味着我需要为所有其他实现提供空实现?

由于

1 个答案:

答案 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添加一个方法,可能在某些派生类中重新实现它,但重新编译所有派生的(因为基础已更改)。

看,这里没有演员表。