Базовые данные, данные времени выполнения, сетевые данные в XML - PullRequest
0 голосов
/ 21 июня 2011

Допустим, у меня есть класс автомобилей в игре, в который можно играть по сети.У нас есть базовые свойства, которые никогда не меняются, такие как model и engineSize, которые одинаковы для каждой игры.У нас есть свойства времени выполнения, такие как текущее местоположение и текущая скорость, которые мы можем сохранить в текущей игре и перезагрузить позже.Наконец, у нас есть данные, которые мы должны передать другим игрокам по сети - возможно, в этом случае местоположение и скорость снова, но, скажем, скорость и расстояниеAwayFromYou.

Итак, у нас есть класс, который может выглядеть примерно так (игнорироватьточный синтаксис или обсуждение идентификаторов):

public Car
{
    public string Model; /* Base data */
    public int EngineSize; /* Base data */
    public PointF Location; /* Runtime data */
    public double Speed; /* Runtime and network data */
    public double distanceAwayFromYou; /* Network data */
}

Теперь я мог бы написать схему для создания сериализуемых частичных классов (например, с использованием xsd.exe) для базовых данных, данных времени выполнения или сетевых данных,Но здесь у меня есть один класс с тремя подмножествами данных XML для использования:

Базовые данные:

<Car>
    <Model>Honda</Model>
    <EngineSize>2999</EngineSize>
</Car>

Данные времени выполнения:

<Car>
    <Location><X>10</X><Y>20</Y></Location>
    <Speed>60.4</Speed>
</Car>

Сетевые данные:

<Car>
    <Speed>60.4</Speed>
    <DistanceFromYou>45.67</DistanceFromYou>
</Car>

Ранее я решил эту проблему с помощью пользовательских атрибутов и отражения;однако, это не красиво и, насколько я знаю, не может автоматически проверять схему.Есть ли более простой способ, или как бы вы это сделали?

Спасибо.

1 Ответ

0 голосов
/ 21 июня 2011

В этом случае попробуйте следующее:

  1. Сделать интерфейс IRuntime:

    public interface IRuntime
    {       
        PointF Location
        {
            get;
            set;
        }
    
        double Speed
        {
            get;
            set;
        }
    }
    
  2. Сделать интерфейс сети:

    public interface INetwork
    {
        double Speed
        {
            get;
            set;
        }
    
        double DistanceAwayFromYou
        {
            get;
            set;
        }
    }
    
  3. Создайте класс, который наследуется от этих интерфейсов:

    class Car : IRuntime, INetwork
    {
        private string _model = string.Empty;
        private int _engineSize = 0;
        private PointF _location = new PointF();
        private double _distanceAwayFromYou = 0; 
        private double _runtimeSpeed = 0;
        private double _networkSpeed = 0;
    
        public string Model
        {
            get
            {
                return _model;
            }
            set
            {
                if (_model != value)
                {
                    _model = value;
                }
            }
        }
    
        public int EngineSize
        {
            get
            {
                return _engineSize;
            }
            set
            {
                if (_engineSize != value)
                {
                    _engineSize = value;
                }
            }
        }
    
        PointF IRuntime.Location
        {
            get
            {
                return _location;
            }
            set
            {
                if (_location != value)
                {
                    _location = value;
                }
            }
        }
    
    
        double INetwork.DistanceAwayFromYou
        {
            get
            {
                return _distanceAwayFromYou;
            }
            set
            {
                if (_distanceAwayFromYou != value)
                {
                    _distanceAwayFromYou = value;
                }
            }
        }
    
    
        double IRuntime.Speed
        {
            get
            {
                return _runtimeSpeed;
            }
            set
            {
                if (_runtimeSpeed != value)
                {
                    _runtimeSpeed = value;
                }
            }
        }
    
        double INetwork.Speed
        {
            get
            {
                return _networkSpeed;
            }
            set
            {
                if (_networkSpeed != value)
                {
                    _networkSpeed = value;
                }
            }
        }
    }
    

Затем в своем коде потребления вы можете сделать следующее:

    Car myCar = new Car();
    //Note that you are able to set only two properties using an instance of Car i.e. Model and EngineSize
    myCar.Model = "test";
    myCar.EngineSize = 9; 

Вы можете сохранить вышеуказанное, если хотите.Но если вы хотите сохранить данные времени выполнения, сделайте следующее:

    IRuntime runtimeCar = (IRuntime)myCar;
    //Note that now you are able to set properties related to runtime data. This is upcasting.
    runtimeCar.Location = new PointF(20, 30);
    runtimeCar.Speed = 50;        

Для данных, связанных с сетью, вы можете сделать следующее:

    INetwork networkCar = (INetwork)myCar;
    //Now you are only able to set properties related to network data using upcast.
    networkCar.Speed = 70;
    networkCar.DistanceAwayFromYou = 50;

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...