C++ 有没有更好的方法来设计这个消息传递代码?

C++ 有没有更好的方法来设计这个消息传递代码?,c++,C++,A类使用以下两个函数来构建和发送消息1和2 builder::prepareAndDeliverMsg1(msg1_arg1,msg1_arg2) { } builder::prepareAndDeliverMsg2(msg2_arg1,msg2_arg2) { } 现在,引入了一个新的B类,它将在两个阶段中完成a所做的工作 第一阶段->准备 第2阶段->交付 我正在考虑扩展builder类,如下所示: ///---- builder::prepareMsg1(msg1_arg1,msg1

A类使用以下两个函数来构建和发送消息1和2

builder::prepareAndDeliverMsg1(msg1_arg1,msg1_arg2)
{
}

builder::prepareAndDeliverMsg2(msg2_arg1,msg2_arg2)
{
}
现在,引入了一个新的B类,它将在两个阶段中完成a所做的工作

第一阶段->准备 第2阶段->交付

我正在考虑扩展builder类,如下所示:

///----

builder::prepareMsg1(msg1_arg1,msg1_arg2)
{
}

builder::prepareMsg2(msg2_arg1,msg2_arg2)
{
}

builder::deliverMsg1(msg1_arg1)
{
    This function, inserts re-calculated msg1_arg1 into the prepared message in stage1
}

builder::deliverMsg2(msg2_arg1)
{
   This function, inserts re-calculated msg2_arg1 into the prepared message in stage1
}

// These two functions are still retained for the usage of class A
builder::prepareAndDeliverMsg1(msg1_arg1,msg1_arg2)
{
}

builder::prepareAndDeliverMsg2(msg2_arg1,msg2_arg2)
{
}

//---

我想知道,是否有更好的设计方法?

我觉得您的解决方案还可以。

也许对于每条消息,创建您自己的类并从基本消息类继承

class TBaseMsg
{
public:
   virtual void prepare() = 0;
   virtual void deliver() = 0;
}

你可以看看装饰设计模式


要扩展Darks的想法,您可以拥有一个基类,该基类实现组合的prepare和deliver,并根据需要允许派生类覆盖这些类:

class base {
    virtual bool prepareMsg1() = 0;
    virtual bool prepareMsg2() = 0;
    virtual bool deliverMsg1() = 0;
    virtual bool deliverMsg2() = 0;
    bool prepareAndDeliverMsg1(){
        prepareMsg1();
        deliverMsg1();
    }
    bool prepareAndDeliverMsg2(msg2_arg1,msg2_arg2){
        prepareMsg2();
        deliverMsg2();
    }
};
您可能会发现两个派生类中的许多功能是相同的,在这种情况下,您不希望在基类中使用纯虚拟:

class base {
    virtual bool prepareMsg1(args) {//not pure virtual
        //do the common stuff
    }
};

class derived {
    bool prepareMsg1( args ) {
        base::prepareMsg1(args);
        //code to specailise the message
    }
};

甚至可能是基类实现了原始类,但允许派生第二个类,而无需重复公共代码。

谢谢Patrick,尽管您的解决方案需要重写现有代码。我希望这样做可以获得更简洁的解决方案。编写C++ C++ CONDEM的人使用的C比C++多。记住,在一个类中定义一个虚拟析构函数,它具有(或来自一个具有至少一个虚函数的类)。或者,您可能会惊讶地发现,在某些情况下,派生类的析构函数没有被调用。感谢所有回答这个问题的专家们。。。!