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