首页 > 解决方案 > 如何处理一个类的不同版本?

问题描述

我目前正在构建一个测试客户端,该客户端需要通过计划 TCP 将数据作为 JSON 发送到服务器应用程序。该协议 - 除了其他元素 - 由消息对象组成。现在,已经需要对 Message 类进行两个不同的修订。它们彼此不相关并且具有完全不同的特性。

这是一个了解这个想法的例子:

协议版本 1

class Message
{
    public string sender { get; set; }
    public int message_id { get; set; }
    public string text { get; set; }
    public int priority { get; set; }
    public List<string> parameters { get; set; }
    public Message()
    {
        this.parameters = new List<string>();
    }
}

协议版本 2

class Message
{
    public int id { get; set; }
    public int someotherid { get; set; }
    public List<string> data { get; set; }
    public Message()
    {
        this.data = new List<string>();
    }
}

这些类没有任何共同点,它们不共享共同的基类型或其他东西。如果我仍然想Message在我的代码中使用它们,我将如何组织这些不同的版本?

我想出的唯一方法是使用不同的命名空间,以便第一个版本存在MyProtocol.Rev1.MessageMyProtocol.Rev2.Message. 这会起作用,我可以简单地在该部分中拉入所需的命名空间using,但它有点静态。有没有更好的办法?

标签: c#classobjectnamespacesversion

解决方案


像这样的东西呢

    Message message = new Message();

    var messagev1 = message.GetProtocol<IMessageProtocolv1>();
    var messagev2 = message.GetProtocol<IMessageProtocolv2>();

    messagev1.message_id = 450077;
    messagev2.id = 1000023;

要做到这一点

   interface IMessage
    {
    }

    interface IMessageProtocolv1 : IMessage
    {
        string sender { get; set; }
        int message_id { get; set; }
        string text { get; set; }
        int priority { get; set; }
        List<string> parameters { get; set; }

    }

    interface IMessageProtocolv2 : IMessage
    { 
        int id { get; set; }
        int someotherid { get; set; }
        List<string> data { get; set; }

    }

    abstract class MessageBase : IMessageProtocolv1, IMessageProtocolv2
    {
        public abstract string sender { get; set; }
        public abstract int message_id { get; set; }
        public abstract string text { get; set; }
        public abstract int priority { get; set; }
        public abstract List<string> parameters { get; set; }
        public abstract int id { get; set; }
        public abstract int someotherid { get; set; }
        public abstract List<string> data { get; set; }
    }

    class Message : MessageBase
    {
        public Message()
        {
            this.parameters = new List<string>();
            this.data = new List<string>();
        }

        public override string sender { get; set; }
        public override int message_id { get; set; }
        public override string text { get; set; }
        public override int priority { get; set; }
        public override List<string> parameters { get; set; }
        public override int id { get; set; }
        public override int someotherid { get; set; }
        public override List<string> data { get; set; }

        public T GetProtocol<T>() 
        {
            return (T)(object)this;
        }
    }

推荐阅读