VAR
ИмяСсылкиНаОбъект : ^ТипОбъекта;
- 287 -
Дальнейшее обращение к объектам и полям тоже будет обычным:
ИмяСсылкиНаОбъект — ссылка на объект,
ИмяСсылкиНаОбъект^ — объект в целом,
ИмяСсылкиНаОбъект^.ИмяПоля— поле данных объекта, ИмяСсылкиНаОбъект^.ИмяМетода — вызов метода объекта.
Динамические объекты могут создаваться стандартной процедурой New:
New( ИмяСсылкиНаОбъект );
Как и обычно, процедура New выделяет в динамической памяти область для хранения данных базового типа ссылки. Турбо Паскаль вводит некоторые расширения для динамического распределения и освобождения объектов. Если динамический объект содержит виртуальные методы, то он должен быть инициализирован с помощью вызова конструктора до вызова всех остальных его методов:
ИмяСсылкиНаОбъект^. ИмяКонструктора( параметры );
В Турбо Паскале процедура New расширена. Она позволяет в одной операции выделить память под объект и вызвать конструктор:
New( ИмяСсылкиНаОбъект, ИмяКонструктора( параметры ) );
Порядок действия такого вызова следующий. Сначала как бы выполняется операция New( ИмяСсылкиНаОбъект ). Если она завершилась успешно, то вызывается конструктор объекта. Иногда удобно описывать поля данных объекта тоже как динамические. В этом случае выделение памяти кучи для них должно происходить в конструкторе. И, конечно, в конструкторе должна происходить необходимая инициализация полей данных (в том числе и вызовы конструкторов для унаследованных полей). Связь экземпляра с таблицей VMT устанавливается самим фактом вызова конструктора. Разместить объект в куче можно также функцией New, возвращающей ссылку на объект. В этом случае параметр, передаваемый New — это тип ссылки на объект, а не сама переменная-ссылка:
TYPE
ТипСсылкиНаОбъект = ^ТипОбъекта;
VAR
ИмяСсылкиНаОбъект : ТипСсылкиНаОбъект;
BEGIN
ИмяСсылкиНаОбъект := New( ТипСсылкиНаОбъект );
...
END.
Точно так же, как и в процедурной форме, в функциональном
- 288 -
варианте New можно использовать второй параметр — имя конструктора типа объекта.
13.6.2. Освобождение объектов. Деструкторы
Для освобождения кучи от динамических объектов применяется стандартная процедура
Dispose( ИмяСсылкиНаОбъект ).
Подобный вызов уничтожит объект в целом. Но если поля данных объекта были динамическими и под них выделялась дополнительная память при выполнении конструктора или иной процедуры инициализации, то их надо освободить до уничтожения самого объекта. Для этих целей (или других завершающих действий) вводится специальный вид метода — деструктор. Он объявляется среди прочих методов служебным словом DESTRUCTOR вместо