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