我有一个消息类和处理器类的廉价软件。每个处理器可以即时接收一个或多个消息。由于每条消息可以具有一些不同的属性,因此我必须将该消息向下转换为concrectate消息类,以进行实际处理。
由于没有。消息类和流程类,我不想使用dynamic_cast。
我尝试使用以下代码,但这会导致编译时错误。
另外,我可以灵活地将处理器指针与消息连接(如果需要),但不能反过来。

class Message
{
    public:
    virtual const Message* const getMessage() const = 0;
};

class MA : public Message
{
    public:
    const MA* const getMessage() const {return this;}
    void printMA() const{std::cout<<"I am MA"<<std::endl;}
};

class MB : public Message
{
    public:
    const MB* const getMessage() const {return this;}
    void printMB() const{std::cout<<"I am MB"<<std::endl;}
};

class Processor
{
public:
    virtual void process(const Message* m) = 0;

};

class PA : public Processor
{
    public:
    void process(const Message* m) {processM(m->getMessage());}

    void processM(const MA*  m) {m->printMA();}
    void processM(const MB*  m) {m->printMB();}
};

int main()
{
    Message* m1 = new MA();
    Message* m2 = new MB();

    Processor* p1 = new PA();
    p1->process(m1);
    p1->process(m2);
    return 0;
}

最佳答案

我终于使用了“双重调度”来解决这个问题。现在,唯一的事情是,每当我添加新的消息类型时,我都需要在MessageProcessor的类中添加一个函数,但是我认为这很好。

class MessageProcessor
{
    public:
        virtual void process(const MA*) const{std::cout<<"unhandled:MA"<<std::endl;}
        virtual void process(const MB*) const{std::cout<<"unhandled:MB"<<std::endl;}
        virtual void process(const MC*) const{std::cout<<"unhandled:MC"<<std::endl;}
};

class Message
{
    public:
    virtual void process(const MessageProcessor*) const = 0;
};

class MA : public Message
{
    public:
    void printMA() const{std::cout<<"I am MA"<<std::endl;}
    virtual void process(const MessageProcessor* p) const {p->process(this);}
};

class MB : public Message
{
    public:
    void printMB() const{std::cout<<"I am MB"<<std::endl;}
    virtual void process(const MessageProcessor* p) const {p->process(this);}
};

class MC : public Message
{
    public:
    void printMC() const{std::cout<<"I am MC"<<std::endl;}
    virtual void process(const MessageProcessor* p) const {p->process(this);}
};

class Processor : public MessageProcessor
{
    public:
    void processM(const Message* m){m->process(this);}

};

class PA : public Processor
{
    public:
    void process(const MA*  m) const {m->printMA();}
    void process(const MB*  m) const {m->printMB();}
};

class PB : public Processor
{
    public:
    void process(const MA*  m) const {m->printMA();}
    void process(const MC*  m) const {m->printMC();}
};

int main()
{
    const Message* m1 = new MA();
    const Message* m2 = new MB();
    const Message* m3 = new MC();

    Processor* p1 = new PA();
    p1->processM(m1);
    p1->processM(m2);
    p1->processM(m3);

    Processor* p2 = new PB();
    p2->processM(m1);
    p2->processM(m2);
    p2->processM(m3);

    return 0;
}

08-25 05:20