0

我有两种消息:MessageAMessageB,都派生自IMessage包含纯虚方法的抽象类std::string toString()。所以我可以使用指向基类的指针将每条消息转换为其字符串表示形式。没关系。但是,我需要以某种方式从字符串构造消息(具体类型的消息),例如: MessageA* msg = [something].fromString( str ). 如果给定的字符串不适合构造MessageA. 我可以看到完成此任务的两种方法:

a)MessageFactorydynamic_cast

    class MessageFactory
    {
        IMessage* fromString( const std::string& str );
    };

    ...
    MessageFactory mf;
    MessageA* msg = dynamic_cast< MessageA* >( mf.fromString( str ) );
    if ( msg ) { ... } 

但是,这使用了我想避免的 dynamic_cast 。

b) 每个派生类中的工厂方法

static MessageA* fromString( const std::string& str )
{
    return stringIsOk( str ) ? new MessageA() : NULL;
}

有没有更好的解决方案?我应该在一般设计中改变一些东西吗?谢谢你。

更新

有时我知道我应该从字符串中得到什么样的消息,即

void sendRequest()
{
 ...
 std::string response;
 MessageA* msg = fromString( response );
 // here i should only check if string is valid for MessageA
}

但有时我不知道我会遇到什么:

void processMessage( const std::string& str )
{
     IMessage* msg = fromString( str );
     if ( msg )
     {
         MessageA* msgA = dynamic_cast< MessageA* >( msg );
         if ( msgA )
         ...
     } 
}
4

1 回答 1

0

您可以在程序启动时使所有派生自IMessage注册它们自己(或者更确切地说是特定工厂)的MessageFactory类静态地使用一个类。这可以通过使用一些静态实例来实现。然后,该IMessage接口需要有一个纯虚方法canConstructFrom(string&),这样当一个字符串进入时,您将其传递给MessageFactory并且工厂将找出可以从该字符串构造哪些派生类并实例化正确的类。

于 2013-07-01T12:11:10.470 回答