5.4 Конструкторы и деструкторы

На верх  Назад  Вперёд

Как можно увидеть на синтаксической диаграмме объявления объекта, Free Pascal поддерживает конструкты и деструкторы. При использовании объектов программист отвечает за вызов конструктора и деструктора явно.

Описание конструктора или деструктора выглядит следующим образом:


Конструкторы и дестукторы

502


Если объект использует виртуальные методы, обязательно требуется пара конструктор/деструктор. Причина состоит в том, что для объекта с виртуальными методами, требуется некоторое внутреннее обслуживание: это обслуживание делается конструктором. Указатель на VMT  должен быть установлен

При объявлении объектного типа должен использоваться простой идентификатор для имени конструктора или деструктора. При реализации конструктора или деструктора, должен использоваться полный идентификатор метода, то есть идентификатор вида objectidentifier.methodidentifier.

Free Pascal поддерживает также расширенный синтаксис процедур New и Dispose. В случае, если нужно выделить память для динамической переменной объектного типа, имя конструктора может быть передано при вызове New. New реализована как функция, которая возвращает указатель на экземпляр объекта. Рассмотрим следующее объявление:

Type

TObj = object;

Constructor init;

...

end;

Pobj = ^TObj;

Var PP : Pobj;

Тогда следующие три вызова эквивалентны:

pp := new (Pobj,Init);

и

new(pp,init);

и также

new (pp);

pp^.init;

В последнем случае компилятор выдаст предупреждение, что должен использоваться расширенный синтаксис New и Dispose, чтобы генерировать экземпляры объекта. Возможно проигнорировать это предупреждение, но использование расширенного синтаксиса лучшая практика программирования, для создания экземпляров объектов. Точно так же процедура Dispose принимает имя деструктора. Прежде, чем удалить объект из "кучи", будет вызван деструктор.

В связи с предупреждением компилятора, в следующей главе представлен подход Delphi для объектно-ориентированного программирования, и может считаться более естественным способом объектно-ориентированного программирования.