Доступ к свойствам класса двумя способами - PullRequest
0 голосов
/ 01 сентября 2010

Я застрял при создании архитектуры класса, чтобы сделать это:

У меня очень много (около 78) типов блоков.Уровень для игры состоит из этих блоков.В ByteArray уровня есть просто числа, обозначающие тип блока.Поэтому для обработки столкновений я могу просто получить число в нужной позиции и получить свойства этого блока.(Сплошная, выбираемая, видимая, текстура).НО.Я буду переупорядочивать этот список блоков, и поэтому мне также нужен способ получить доступ к свойствам блока по имени.

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

Blocks [5] .Properties

&

Blocks.Rock.Properties

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

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Если вам нужны Blocks [5] .Properties, а также Blocks.Rock.Properties, Blocks должен быть пользовательским классом с индексатором. Настройка аналогична операции:

public Block this[] (int index) 
{
   //getter logic here
}

Индексаторы могут принимать целочисленные типы или строки, поэтому вы можете использовать блоки для переноса словаря и доступа к значениям по ключу: Blocks["Rock"].Properties. Это включает в себя «волшебные строки», которые компилятор не будет ловить, если вы ошиблись.

Именованные геттеры - это простые свойства только для чтения:

public Block Rock { get{//getter logic here} }

Если бы это было мое приложение, я бы создал одноэлементный класс Blocks. Блоки являются неотъемлемой частью игры, используются на протяжении всей ее жизни, и вы не хотите явно их создавать; определение одноэлементного сценария (и его легче заменить на экземпляр с нормальной областью действия, чем если бы он был статичным). Этот класс Blocks обернет коллекцию объектов Block, а затем эта реализация будет скрыта за средствами доступа Blocks. Вы можете использовать список и искать их свойства с помощью Linq (я предполагаю, что свойства блока будут включать BlockID, а также его имя), или вы можете выбрать индекс или имя блока в качестве ключа словаря Блоки.

0 голосов
/ 01 сентября 2010

Поскольку различные типы блоков являются целыми числами, вы можете использовать карту / словарь / ассоциативный массив.

Dictionary<string, int> BlockTypes = new Dictionary<string, int>();
BlockTypes["Rock"] = 1337;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...