|
Динамические объекты. Деструкторы.Date: 2015-10-07; view: 394.
Экземпляры объектовых типов могут быть определены также и динамически, с использованием стандартной процедуры New. На практике этот способ применяется значительно чаще. Экземпляр в общем виде определяется так: Var <имя ссылки на объект>^. <тип объекта> Техника динамического порождения и инициализации объектов выглядит для нашего примера следующим образом: Var ObCirclePtr: ^Circle; begin New (ObCirclePtr); ObCirclePtr^.Init (20, 30, 10); ……………………… В целях большей наглядности Turbo Pascal допускает совмещение порождения объекта и его инициализации конструктором в одном вызове New: New (ObCirclePtr, Init (20, 30, 10)); Освобождение динамической памяти, выделенной объекту, реализуется стандартной процедурой Dispose: Dispose (<имя ссылки на объект>); Необходимо учесть, что если поля данных объекта были динамическими и для них выделялась дополнительная память, то их надо освободить до уничтожения самого объекта. Для этих целей или для других завершающих действий перед уничтожением вводится специальный вид метода – деструктор. Он объявляется среди прочих методов с помощью замены ключевого слова Procedure на служебное слово Destructor. Функции деструктора по сути противоположны функциям конструктора. Действие завершается ключевым словом Done. Деструкторы могут наследоваться, при этом желательно делать их виртуальными, чтобы выполнялся тот деструктор, который соответствует именно этому типу объекта. Имеется также расширенная возможность использования процедуры уничтожения: Dispose (<имя ссылки на объект>, <имя деструктора>); При этом вначале выполняется деструктор, а затем объект уничтожается. Если объект содержит виртуальные методы, то деструктор осуществляет поиск размера объекта, т.е. того участка памяти, который нужно уничтожить. Чтобы выполнение уничтожения было корректным, используют пустой блок: Begin End;
|