繁体   English   中英

派生类和'阴影'的解决方案

[英]Solutions for derived class and 'shadowing'

我有一个与此类似的问题。

我的问题如下:

我有一些基本消息,为所有其他消息提供基本方法

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之上的读取方法。即。 MessageType1_extended将执行MessageType1的读取。

我理解为什么这是通过阅读之前的相关问题而发生的,但我的问题是这是否有任何解决办法。 有没有什么方法可以转换为它的类型并调用自己的override方法而无需将类型硬编码为((MessageType1_extended)extractedMessage).read(); ??

谢谢。

您可以通过Reflection动态调用正确类型的方法。

然而,令我感到震惊的是,整体解决方案已经成熟,可以进行重新设计。 您可能不应该使用基类来返回其自己类型的新实例。 对于我要解决的整体问题,我不完全清楚,但您可能会考虑访问者模式实现是否会更加干净以生成已解析的消息。

或者,您可以使用多态递归使每个类调用其基类的提取方法,并在返回值时构建结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM