gpt4 book ai didi

.net - TypeOf 子类的设计模式

转载 作者:行者123 更新时间:2023-12-04 05:55:27 24 4
gpt4 key购买 nike

我正在研究串行数据协议(protocol)的解析器。我有一个总体 Packet类,几个子类,例如 CommandPacketStatusPacket ,然后是每个子类的几个子类:

  • 小包
  • 命令包
  • 命令类型A
  • CommandTypeB
  • 状态包
  • 状态类型A
  • 状态类型B
  • Packet类有一个静态方法用于从缓冲区中取出数据,如果它代表一个有效的数据包,则返回 Packet 的新实例类,用必要的数据实例化。

    现在,这就是我的问题出现的地方。 我希望能够返回 最具体的数据包类型。为此,我创建了一个静态 .isValid()方法,它在子类上被覆盖。这个想法是我可以循环遍历每种类型的特定数据包( CommandTypeACommandTypeBStatusTypeAStatusTypeB 等)调用 .isValid()直到其中一个返回 TRUE .那时,我将返回该特定数据包类型的新实例。

    虽然我当然可以直接创建此方法,但我如何解释尚未添加到我的项目中的数据包类型?我希望将来有人能够扩展我的类(class)而无需修改原来的 Packet类(class)。

    我已经考虑过为此使用反射,但我正在避免它,因为这些方法会为每个接收到的数据包调用,并且必须是有效的。

    关于我应该如何重新设计我的设计模式有什么想法吗?

    虽然我不认为这与讨论完全相关,但我在 VB.NET 中这样做。这里也发布了一个类似(但不完全相同)的问题: Java - subclass validation design pattern

    最佳答案

    根据评论和 MarkJ 的领导,这里有一个建议(最终基于接口(interface)而不是属性来进行更强的类型检查):

    public interface IPacketValidator
    {
    bool IsPacketValid( Packet packet );
    Type PacketType { get; }
    }

    public class ValidatorsRegistry
    {
    private List<IPacketValidator> m_validatorsList;

    private static ValidatorsRegistry m_Instance = new ValidatorsRegistry();
    public static ValidatorsRegistry Instance { get { return m_Instance; } }

    private ValidatorsRegistry()
    {
    InitValidatorsRegistry();
    }

    private void InitValidatorsRegistry()
    {
    m_validatorsList = new List<IPacketValidator>();

    Type iPacketValidatorType = typeof( IPacketValidator );

    foreach ( Assembly asm in AppDomain.CurrentDomain.GetAssemblies() )
    {
    foreach ( Type type in asm.GetTypes() )
    {
    if ( iPacketValidatorType.IsAssignableFrom( type ) && type != iPacketValidatorType )
    {
    IPacketValidator validator = (IPacketValidator)Activator.CreateInstance(type);
    m_validatorsList.Add( validator );
    }
    }
    }
    }

    public Type GetSpecificPacketType(Packet packet)
    {
    Type packetType = typeof( Packet );
    foreach ( IPacketValidator validator in m_validatorsList )
    {
    if ( validator.IsPacketValid( packet ) )
    {
    packetType = validator.PacketType;
    break;
    }
    }

    return packetType;
    }
    }

    关于.net - TypeOf 子类的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9559283/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com