Как бороться с разными ревизиями класса? - PullRequest
1 голос
/ 04 февраля 2020

В настоящее время я создаю тестовый клиент, который должен отправлять данные как JSON по плану TCP в серверное приложение. Протокол - помимо других элементов - состоит из объектов сообщения. Прямо сейчас уже должны быть две разные ревизии класса 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. Есть ли лучший способ?

1 Ответ

0 голосов
/ 04 февраля 2020

Как насчет чего-то подобного

    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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...