我有一个类似于this one的问题。
我的问题如下:
我有一些基本消息,为所有其他消息提供基本方法
public class BaseMessage : ISpecificMessage1
{
public MsgType {get;set;} //enum
public abstract void read(BinaryReader br);
public abstract void write(BinaryWriter bw);
}
我有派生类来覆盖这些基本方法。即
public class MessageType1 : BaseMessage
{
public override void read(BinaryReader br)
{
//Do the read..
}
public override void write(BinaryWriter bw)
{
//Do the write..
}
}
我有更深层次的其他派生类再次覆盖方法
public class MessageType1_Extended : MessageType1
{
public override void read(BinaryReader br)
{
//Do the read different to MessageType1..
}
public override void write(BinaryWriter bw);
{
//Do the write different to MessageType1..
}
}
我目前的问题是我正在运行一个消息解析器,我调用一个静态方法来删除包装器,决定消息的类型并将消息作为BaseMessage返回
public static BaseMessage extractMessage(byte[] msg)
{
//Remove header... get type...
switch(MsgType)
{
case type1_ext:
return new MessageType1_Extended()
//etc...
}
}
当我在提取的消息上调用.read()时,深度超过2级的类只调用BaseMessage以上级别的read方法。即。 MessageType1_extended将执行MessageType1的读取。
我理解为什么这是通过阅读之前的链接问题而发生的,但我的问题是这是否有任何解决办法。 是否有任何方法可以转换为其类型并调用自己的覆盖方法而无需将类型硬编码为 ((MessageType1_extended)extractedMessage).read(); ??
感谢。
答案 0 :(得分:0)
您可以通过Reflection动态调用正确类型的方法。
然而,令我感到震惊的是,整体解决方案已经成熟,可以进行重新设计。您可能不应该使用基类来返回其自己类型的新实例。对于我要解决的整体问题,我不完全清楚,但您可能会考虑访问者模式实现是否会更加干净以生成已解析的消息。
或者,您可以使用多态递归让每个类调用其基类的提取方法,并在返回值时构建结果。