如何处理一个类的不同版本?

Posted

技术标签:

【中文标题】如何处理一个类的不同版本?【英文标题】: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 部分中拉入所需的命名空间,但它有点静态。有没有更好的办法?

【问题讨论】:

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

【讨论】:

以上是关于如何处理一个类的不同版本?的主要内容,如果未能解决你的问题,请参考以下文章

yarn 工作空间如何处理不同版本的外部依赖?

Akka 如何处理消息版本?

如何处理同一站点的两个版本

如何处理具有完全不同构建系统的第三方库?

Python 的“open()”为“找不到文件”抛出不同的错误——如何处理这两个异常?

TSINGSEE青犀视频通过Webrtc编译android版本找不到gzip模块如何处理?