Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
69
Добавлен:
17.05.2015
Размер:
519.68 Кб
Скачать

Реализация конструкторов

В задачу конструктора входит создание экземпляра класса и выполнение операторов, содержащихся в его теле. Назначение кода внутри конструктора – инициализировать только что созданный экземпляр объекта. Синтаксис реализации конструктора:

Constructor <имя класса>.<имя конструктора>[(<параметры>}}; [<блок объявлений>} Begin <Исполняемые операторы> End;

Реализация наследуемых конструкторов.

Constructor <имя класса>.<имя конструктора>[(<параметры>)]; [<блок обьявлений>} Begin Inherited <имя конструктора>[(<параметры>)}; <инициализация собственных полей> End;

Примечания: • Следует убедиться, что для каждого поля в конструкторе предусмотрен оператор присвоения, и что все поля переходят из неопределенного состояния в какое-то конкретное, предусмотренное по умолчанию, хотя и известно, что транслятор сам выполнит инициализацию нулевыми значениями ('', Nil, False - для других полей). Для неклассовых полей такая инициализация вполне допустима, поскольку позволяет их использовать в дальнейшем. • Для вызова наследуемого конструктора следует использовать ключевое слово Inherited, которое фактически обеспечивает доступность перекрытого метода. Сила оператора в том, что он вызывает старое, а затем возвращается к новому. • Как правило, следует вызывать подходящий наследуемый конструктор в первом исполняемом операторе. • Только, если у пользовательского класса нет новых полей, можно не создавать для него конструктор. • Хотя в объявлениях конструкторов и не указывается тип возвращаемого результата, и они выглядят, как объявления процедур, конструкторы используются скорее как функции, а не как процедуры. Можно сказать, что конструктор является неявной функцией - он возвращает нового представителя того класса, который использовался при его вызове. Нет необходимости в явном виде задавать тип возвращаемого результата, поскольку этот тип и так известен на момент вызова - это тип использованного в вызове конструктора класса. • Внутри конструктора отсутствует и явное присвоение возвращаемого значения. Такое возможно, поскольку он всегда возвращает ссылку (адрес) на вновь созданный и инициализированный экземпляр класса. • Начиная с класса TComponent конструктор Create стал виртуальным и при его переопределении необходимо указывать слово-директиву Override.

Реализация деструкторов

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

Синтаксис реализации деструктора:

Destructor <имя класса>.<имя деструктора>[(<параметры>)]; [<блок объявлений>] Begin <исполняемые операторы> End;

Реализация наследуемых деструкторов Если использовать механизм наследования деструкторов, то можно упростить задачу уничтожения экземпляров класса, таким образом, чтобы каждый раз заботиться лишь об уничтожении тех полей, которые были добавлены в данном классе. Всю работу по очистке наследуемых полей можно возложить на наследуемые деструкторы. Для вызова наследуемого деструктора необходимо используется ключевое слово Inherited.

Синтаксис объявления наследуемого деструктора следующий:

Destructor <имя класса>.<имя деструктора>[(<параметры>)}; [<блок объявлений>] Begin <уничтожение собственных полей> Inherited <имя деструктора>[{<параметры>)]; End;

Примечания: • Внутри деструктора есть доступ не только к обычным идентификаторам, но и к полям экземпляра класса, инкапсулированным при его определении. • Исполняемые операторы деструктора должны позаботиться обо всех операциях очистки, необходимых для уничтожения экземпляра класса. Код деструктора должен уничтожить все внутренние экземпляры объектов и освободить динамическую память, которая была зарезервирована во время существования экземпляра класса. Однако нет необходимости явно устанавливать в нулевые значения поля прямого доступа. • Необходимость в объявлении деструкторов с параметрами возникает очень редко. Обычно все, что нужно сделать деструктору – уничтожить экземпляр класса, и вся необходимая для этого информация и так доступна ему. • Если у класса нет полей косвенного доступа, то деструктор можно не создавать для такого пользовательского класса.

Соседние файлы в папке шпоры