如何处理一个类的不同版本?
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;
【讨论】:
以上是关于如何处理一个类的不同版本?的主要内容,如果未能解决你的问题,请参考以下文章