XNA Class Design со структурами как свойствами и проблемами, потому что они являются типами значений, а не ссылочными типами - PullRequest
2 голосов
/ 23 марта 2010

Мне интересно, как бы вы порекомендовали проектировать класс, учитывая тот факт, что XNA Framework повсеместно использует Struct?

Например, класс spite, для которого может потребоваться доступ к Vector2 и Rectangle (оба определены как Struct) вне класса.

Проблема возникает, когда вы пытаетесь написать такой код:

class Item 
{
    public Vector2 Position {get; set;}
    public Item() { Position = new Vector2(5,5); }
}

Item i = new Item();
i.Positon.X = 20; // fails with error 'Cannot modify the return value of Item because it is not a variable.'

// you must write code like this
var pos = i.Position;
pos.X++;
i.Position = pos;

Второй вариант компилируется и работает, но он просто ужасен. Есть ли лучший способ?

Ответы [ 3 ]

6 голосов
/ 23 марта 2010

Или, просто чтобы выбросить это ... просто выставить поле. Нет ничего плохого в том, чтобы выставлять открытые поля.

Например, если ваша сущность выставляет Vector3 для своей позиции, так что другие вещи могут использовать это значение в своих собственных вычислениях ... просто выставьте его. В противном случае, если никакой другой класс или сущность не должны знать позицию, не раскрывайте ее вообще: -)

Вот несколько мудрых советов от Рико Мариани :

Как правило, мне кажется, что свойства сильно переоценены, а поля ужасно недоиспользуются. Я упоминал, что не все согласны с этой позицией? :)

5 голосов
/ 23 марта 2010

Добавьте метод к вашему классу предметов что-то вроде:

public void Move(int xAmount, int yAmount)
{
   var newPosition = new Point(this.Position.X + xAmount, this.Position.Y + yAmount);
   this.Position = newPosition;
}

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

i.Move(1,1)

что бы сдвинуть его вправо на один пиксель. Вы можете иметь варианты этого метода, такие как MoveRight() MoveLeft() и т. Д.

3 голосов
/ 23 марта 2010

Вы также можете абстрагироваться от struct:

private Vector2 position;
public float X
{
    get
    {
        return position.X;
    }
    set
    {
        position.X = value;
    }
}

И используйте это так:

Item i = new Item();
i.X = 20;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...