26. Дескрипторы объектов

Дескриптор объекта в BGT проще всего представлять как переменную, указывающую на некоторый объект.
Через эту переменную можно получить доступ к свойствам и методам объекта, на который она указывает.
При объявлении такой переменной её тип обозначается постфиксом в виде символа @ («собака») вслед за именем класса, на объект которого она будет указывать:
sound@ shot;
Это пример дескриптора для объекта класса sound.
Этот дескриптор никак не инициализирован, то есть указывает на пустоту.
Для инициализации дескриптора достаточно присвоить ему новый объект соответствующего класса:
sound@ shot;
@shot = sound;
shot.load("sounds\\shot.wav");
Когда необходимо обратиться к самому дескриптору , то его имя нужно предварять префиксом @, а когда нужно получить доступ к свойству или методу объекта, на который указывает дескриптор, этот префикс добавлять не надо.
Ключевое слово is используется для того, чтобы выяснить, указывают ли два разных дескриптора на один и тот же объект.
Например:
sound s;
sound@ sh1;
sound@ sh2;

@sh1 = s;
@sh2 = s;

if (sh1 is sh2)
{
// ...
}
Также при помощи is выполняется проверка пустого дескриптора:
if (sh1 !is null)
{
//...
}
Дескриптор суперкласса может указывать на объект подкласса, что, по сути, и есть реализация полиморфизма.
Пример:
class unit
{
void update ()
{
alert("Информация", "unit::update");
}
}

class farmer : unit
{
alert("Информация", "farmer::update");
}

class warrior : unit
{
alert("Информация", "warrior::update"); }

void main ()
{
// Массив из двух дескрипторов объектов типа unit.
units@[] = units(2);

// В реальной игре здесь
// должна быть инициализация игрового уровня,
// например по карте из файла.
@units[0] = farmer();
@units[1] = warrior();

// В игровом цикле перебираем все объекты
// и обновляем их состояние.
for (int i=0; i {
units[i].update();
}
}
Дескрипторы позволяют управлять выделением и освобождением памяти более эффективно, чем это делает встроенный уборщик мусора.
Например, если дескриптору, ссылающемуся на существующий объект, присвоить значение null, то это приведёт к уничтожению объекта (при условии, что нет других дескрипторов, ссылающихся на этот объект), то есть будет вызван деструктор этого объекта и память, занятая объектом, будет освобождена.

Назад | Содержание | Вперёд

Поделитесь с друзьями

WordPress Lessons