2011-06-19 44 views
0

我想执行双重调度。 说我有一个类,像这样:在方法/函数重载中,每个版本都必须重新实现吗?

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

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

我想知道的另一件事是,如果我需要重新实现每个类中的每一个。

说球员需要回应一个项目的事件处理程序。这是否意味着我需要为所有其他人提供空实现?

感谢

回答

2

在双重分发你有两个类层次结构,A和B. A有为数众多的采取不同版本B的和B有需要A.每种方法的单一重载方法需要一个参数。您需要在A基类中声明所有不同的版本,并在A派生类中实现所有这些版本。您还需要在每个B派生类中重新实现B方法。是的,这意味着A提前知道每一个B版本。假设你有3个具体的消息,一个KeyboardMessage,一个MouseMessage和一个ScreenMessage。您还拥有一个不断增长的实体系列,此时它由一个Widget和一个小工具组成。在类似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添加一个方法,可能会在某些派生类中重新实现它,但是重新编译所有派生的(因为基础已更改)。

看,没有在这里投。

+0

所以我应该通过铸造解决它?看起来好些,我不明白这有什么坏处。 – jmasterx

+1

铸造不解决任何问题,不要这样做。在维基百科上阅读访问者模式。 –

+0

我在回答中添加了一些伪代码。 –

相关问题