Конструкторы и деструкторы
Конструкторы и деструкторы являются специализированными фор- мами методов. Используемые в связи с расширенным синтаксисом стандартных процедур New и Dispose, конструкторы и деструкторы обладают способностью размещения и удаления динамических объек- тов. Кроме того, конструкторы имеют возможность выполнить требуе- мую инициализацию объектов, содержащих виртуальные методы. Как и все другие методы, конструкторы и деструкторы могут наследовать- ся, а объекты могут содержать любое число конструкторов и дест- рукторов.
Конструкторы используются для инициализации вновь созданных объектов. Обычно инициализация основывается на значениях, переда- ваемых конструктору в качестве параметров. Конструктор не может быть виртуальным, так как механизм диспетчеризации виртуального метода зависит от конструктора, который первым совершил инициали- зацию объекта.
------------- ---- ------------- ---- описание --->¦ заголовок +-->¦ ; +-->¦ блок +-->¦ ; +-> конструктора ¦конструктора¦ L---- ¦подпрограммы¦ L---- L------------- L-------------
------------ -------------- заголовок ---->¦constructor+T>¦идентификатор+-T----------------> конструктора L------------¦ L--------------^¦ ----------- ^ ¦ --------------¦¦ ¦ список ¦ ¦ L>¦ уточненный +-L->¦формальных+-- ¦идентификатор¦ ¦параметров¦ ¦ метода ¦ L----------- L--------------
Приведем несколько примеров конструкторов:
constructor Field.Copy(var F: Field); begin Self := F; end;
constructor Field.Init(FX, FY, FLen: integer; FName: string); begin X := FX; Y := FY; GetMem(Name, Length (FName) + 1); Name^ := FName; end;
constructor TStrField.Init(FX, FY, FLen: integer; FName: string); begin inherited Init(FX, FY, FLen, FName); Field.Init(FX, FY, FLen, FName); GetMem(Value, Len); Value^ := ''; end;
Главным действием конструктора порожденного (дочернего) ти- па, такого как указанный выше TStrField.Init, почти всегда явля- ется вызов соответствующего конструктора его непосредственного родителя для инициализации наследуемых полей объекта. После вы- полнения этой процедуры, конструктор инициализирует поля объекта, которые принадлежат только порожденному типу.
Деструкторы ("сборщики мусора") являются противоположностями конструкторов и используются для очистки объектов после их ис- пользования. Обычно очистка состоит из удаления всех полей-указа- телей в объекте.
Примечание: Деструктор может быть виртуальным и часто является таковым. Деструктор редко имеет параметры.
Приведем несколько примеров деструкторов:
destructor Field.Done; begin FreeMem(Name, Length (Name^) + 1); end;
destructor StrField.Done; begin FreeMem(Value, Len); Field.Done; end;
Деструктор дочернего типа, такой как указанный выше TStrField.Done, обычно сначала удаляет введенные в порожденном типе поля указателей, а затем в качестве последнего действия вы- зывает соответствующий сборщик деструктор непосредственного роди- теля для удаления унаследованных полей-указателей объекта.