【问题标题】:How to deal with different revisions of a class?如何处理一个类的不同版本?
【发布时间】:2020-05-19 23:38:45
【问题描述】:

我目前正在构建一个测试客户端,它需要通过计划 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.Message 中,另一个存在于MyProtocol.Rev2.Message 中。这会起作用,我可以简单地在using 部分中拉入所需的命名空间,但它有点静态。有没有更好的办法?

【问题讨论】:

  • 命名空间是要走的路,不同的修订应该是静态的,所以当它感觉静态时它是完美的。我还将不同的修订版放在不同的库中
  • 你是对的,这是有道理的。我想也许有一些我还没有听说过的神奇功能,但命名空间肯定会完成这项工作。

标签: c# class object namespaces version


【解决方案1】:

这样的事情呢

    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;
        }
    }

【讨论】:

    猜你喜欢
    • 2015-01-24
    • 2013-04-11
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多