代码之家  ›  专栏  ›  技术社区  ›  Benjamin Manns

不添加任何数据字段的向上转换

  •  0
  • Benjamin Manns  · 技术社区  · 16 年前

    在我的项目中,我有一个通用的 Packet 班级。我想能够向其他班级(比如 LoginPacket MovePacket )

    基类包含命令和参数(大大简化):

    public class Packet
    {
        public String Command;
        public String[] Arguments;
    }
    

    我希望能够根据检查将包转换为loginpacket(或任何其他包) Packet.Command == "LOGIN" . 登录数据包将不包含任何新的数据成员,而只包含访问特定参数的方法。例如:

    public class LoginPacket : Packet
    {
        public String Username
        {
            get { return Arguments[0]; }
            set { Arguments[0] == value; }
        }
        public String Password
        {
            get { return Arguments[1]; }
            set { Arguments[1] == value; }
        }
    }
    

    如果我能运行一个简单的代码 小包裹 登录包 有点像 LoginPacket _Login = (LoginPacket)_Packet; 但是那会导致 System.InvalidCastException .

    这似乎是一项简单的任务,因为没有新的数据包含在内,但除了从 小包裹 类到新的 登录包 班级。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Vivek    16 年前

    更好的方法是 Packet 实例封装者 LoginPacket .

    这将允许您执行以下操作:

    LoginPacket _Login = new LoginPacket(_packet);

    也可以考虑创建一个 PacketFactory 所有的逻辑都需要创建 小包裹 进来了。

    public class Packet
    {
        public String Command;
        public String[] Arguments;
    }
    
    public abstract class AbstractPacket
    {
        private Packet _packet;
    
        public AbstractPacket(Packet packet)
        {
            _packet = packet;
        }
    
        public string this[int index]
        {
            get { return _packet.Arguments[index]; }
            set { _packet.Arguments[index] = value; }
        }
    }
    
    public class LoginPacket : AbstractPacket
    {
        public LoginPacket(Packet packet): base(packet)
        {            
        }
    
        public string Username
        {
            get { return base[0]; }
            set { base[0] = value; }
        }
        public string Password
        {
            get { return base[1]; }
            set { base[1] = value; }
        }
    
    }
    
        2
  •  0
  •   Vivek    16 年前

    如果不同类型的数据包只因可用的数据成员而不同,则可以执行以下操作:

    使用packetgenerator生成数据包为:

    Packet packet = PacketGenerator.GetInstance(packetdata);
    

    访问属性为:

    Console.WriteLine("User Name: {0}", packet["UserName"]);
    

    代码…

    public enum PacketType { Undefined, LoginPacket, MovePacket }
    
    public class PacketData
    {
        public String Command;
        public String[] Arguments;
    }
    
    public class Packet
    {
        public readonly PacketType TypeOfPacket;
        private Dictionary<string, string> _argumentMap;
    
        public Packet(PacketType _packetType,
                      Dictionary<string, string> argumentMap)
        {
            TypeOfPacket = _packetType;
            _argumentMap = argumentMap;
        }
    
        public string this[string index]
        {
            get { return _argumentMap[index]; }
            set { _argumentMap[index] = value; }
        }
    }
    
    public static class PacketFactory
    {
        Packet GetInstance(PacketData packetData)
        {
            Dictionary<string, string> argumentMap
                                = new Dictionary<string, string>();
            PacketType typeOfPacket = PacketType.Undefined;
    
            // Replace inline strings/int with static/int string definitions
            switch (packetData.Command.ToUpper())
            {
                case "LOGIN":
                    typeOfPacket = PacketType.LoginPacket;
    
                    argumentMap["UserName"] = packetData.Arguments[0];
                    argumentMap["PassWord"] = packetData.Arguments[1];
                    break;
    
                case "MOVE":
                    typeOfPacket = PacketType.MovePacket;
                    //..
                    break;
                default:
                    throw new ArgumentException("Not a valid packet type");
            }
    
            return new Packet(typeOfPacket, argumentMap);
        }
    }
    
    推荐文章