Как сделать "статический перегруженный const" в C #? - PullRequest
7 голосов
/ 02 июня 2011

Я создаю игру на C #.Каждый уровень состоит из нескольких плиток.Каждая плитка имеет определенный тип, например, пол из травы, деревянная стена и т. Д.

В идеале я хотел бы иметь один базовый класс «Плитка» и наследовать его для создания классов для каждого типа плитки.Мне бы хотелось, чтобы свойства тайла были своего рода статическим / const / etc членом подкласса, поскольку каждый тип тайла всегда будет иметь одинаковые свойства.Т.е. я не хочу, чтобы у 100 плиток было свойство, которое имеет одинаковое значение, что кажется довольно неэффективным.

Проблема в том, что вы не можете сделать это в C #.Есть ли способы достичь того, чего я хочу?

Моя альтернативная идея состояла в том, чтобы разделить все это на деревья, один с единственным классом "Tile", который представляет экземпляр, и другой "TileType", из которого я создаю экземпляр.объект для каждого типа и, возможно, доступ к ним через какой-то "TileTypeCollection".Это кажется странным, и я предпочел бы сделать это в первую очередь.

Существуют ли какие-либо общие рекомендации при работе с такой ситуацией?

Ответы [ 5 ]

4 голосов
/ 02 июня 2011

Вы ищете шаблон проектирования FlyWeight:

http://en.wikipedia.org/wiki/Flyweight_pattern

Flyweight - это шаблон проектирования программного обеспечения.Flyweight - это объект, который минимизирует использование памяти, делясь как можно большим количеством данных с другими подобными объектами;это способ использовать объекты в большом количестве, когда простое повторное представление будет использовать недопустимый объем памяти.

enter image description here

У вас есть несколько примеров C # здесь: http://www.dofactory.com/Patterns/PatternFlyweight.aspx#_self2

2 голосов
/ 02 июня 2011

Вы можете создать структуру класса следующим образом:

public abstract class Tile
{
  public abstract string BaseType;
}

public class Floor : Tile
{
  public override string BaseType
  {
    get
    {
       return "floor";
    }
  }
}

public class Grass : Tile
{
  public override string BaseType
  {
    get
    {
       return "grass";
    }
  }
}

public class Wooden : Tile
{
  public override string BaseType
  {
    get
    {
       return "wooden";
    }
  }
}
1 голос
/ 02 июня 2011

Разве вы не можете просто использовать статическое поле для поддержки свойства вашего базового класса Tile?

public abstract class Tile
{
  private static string _commonProperty

  public static string CommonProperty
  {
    get { return _commonProperty; }
    set { _commonProperty = value; }
  }
}
0 голосов
/ 02 июня 2011

Есть несколько вариантов, которые приходят на ум в зависимости от конкретных требований.

ЕСЛИ существует общее свойство, которое отличается по значению для каждого типа, затем объявляет его в базовом классе, делает его доступным только для чтения и устанавливает его в конструкторе каждого типа.

Если у вас есть свойства, которые существуют только для определенного типа, то они должны быть объявлены в подклассе и аналогично только для чтения.

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

Один из способов - иметь статические свойства в дочерних классах и нестатический виртуальный метод доступа в базовом классе, который при переопределении возвращает статические значения.

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