- •1. Новые концепции ооп в языке Oblect Pascal
- •2. Объектно-ориентированный подход в программировании
- •Основные понятия
- •3. Понятие класса и объекта
- •4. Поля, методы и свойства объекта
- •5. Ключевое слово Self, примеры использования
- •6. Перегруженные методы
- •7. Создание и удаление объектов
- •8. Инкапсуляция
- •9. Инкапсуляция и модули
- •10. Директивы видимости
- •11. Инкапсуляция при помощи свойств
- •12. Свойства-массивы
- •13. Индексированные свойства
- •14. Свойства и иерархия классов
- •15. Конструкторы, перегрузка конструкторов, 16. Деструкторы
- •17. Ссылочная модель объектов Delphi
- •18. Наследование
- •19. Совместимость типов
- •20. Полиморфизм и позднее связывание
- •21. Виртуальные, динамические методы
- •22. Абстрактные методы
- •23. Бе6зопасное преобразование типов
- •24. Ссылки на класс
- •25. Создание компонентов при помощи ссылок на класс
- •26. Интерфейсы
- •27. Технические приемы, связанные с использованием интерфейсов (делегирование, использование директивы implements)
- •28. Исключительные ситуации
- •29. Порядок выполнения программы и блок finally
- •30. Классы исключений
- •31. Исключения и отладка приложений
- •32. Класс tObject, использование методов класса Tobject
- •33. Понятие события
- •34. Обработчики событий. Делегирование в Delphi
- •35. События стандартных визуальных компонент и их использование
15. Конструкторы, перегрузка конструкторов, 16. Деструкторы
Конструкторы и деструкторы отвечают за существование объекта в памяти, т.е. выделяют память для экземпляра класса, затем и освобождают ее.
Конструктор — это специальный вид подпрограммы, присоединенный к классу. Его на-значение — создавать представителей (экземпляры) класса. Он ведет себя как функция, которая возвращает ссылку на вновь созданный экземпляр класса, т.е. на объект. Одновременно выделяется память для хранения значений полей экземпляра класса.
Деструктор — это специальная разновидность подпрограммы, присоединенной к классу. Его назначение заключается в уничтожении экземпляра класса, т.е. объекта и освобождении памяти, выделенной под экземпляр.
Синтаксис объявления конструкторов и деструкторов:
Type <имя класса>=Сlass[{Имя родительского класса>)] . . . Constructor Имя конструктора>[(<параметры>)]; [Override;] Destructor <имя деструктора>[(<параметры>)}; [Override;] End;
Примечания: • Объявляются конструкторы и деструкторы, как правило, в разделе Public класса. • В классе может быть объявлено несколько конструкторов, однако чаще бывает один конструктор. Общепринятое имя для единственного конструктора Create. • В одном классе может быть объявлено несколько деструкторов, но чаще бывает один деструктор без параметров (всегда!) с именем Destroy. • За объявлением деструктора по имени Destroy следует указывать ключевое слово-директиву Override, разрешающее выполнение предусмотренных по умолчанию действий для уничтожения экземпляра объекта, если при его создании возникла какая-либо ошибка. Фактически Override переопределяет метод предка • Метод Free так же удаляет (разрушает) экземпляры класса, предварительно проверяя их на Nil.
• Можно сказать, что конструктор является неявной функцией — он возвращает нового представителя того класса, который использовался при его вызове.
• Начиная с класса TComponent конструктор Create стал виртуальным и при его переопределении необходимо указывать слово-директиву Override.
//ПРО КОНСТРУКТОРЫ
Метод create – это конструктор – специальный метод, который можно применить к классу для выделения памяти под экземпляр данного класса. Экземпляр возвращается конструктором, и его можно присвоить переменной для хранения и дальнейшего использования объекта.
По умолчанию TObject.Create устанавливает все данные созданного экземпляра равными нулю. Если необходимо, чтобы экземпляр создавался с другими начальными данными, то нужно написать свой конструктор. Можно либо переопределить конструктор create, либо создать новый конструктор с любым именем, используя слово constructor. Рекомендуется использовать стандартное имя create. При создании нового конструктора не нужно обращаться к TObject.Create, так как память выделяется Delphi.
Конструктор Create обращается к методу класса InstanceSize для определения размера необходимой для размещения объекта памяти. Затем он запрашивает область памяти необходимого размера, используя процедуру NewInstance и инициализирует нулевыми значениями, используя процедуру InitInstance, а в качестве результата возвращает адрес области памяти Пример. TDate = class public constructor Create (y,m,d:integer); … constructor TDate.Create (y,m,d:integer); begin FDate:=Date(y,m,d) end;
В Delphi также возможно переопределение конструктора. Т.е. можно создать несколько конструкторов, назвав их всех именем create.
Constructor <имя класса>.<имя конструктора>[(<параметры>)]; [<блок обьявлений>} Begin Inherited <имя конструктора>[(<параметры>)}; //для наследуемых конструкторов <инициализация собственных полей> End;
ДЕСТРУКТОРЫ
Аналогично конструкторам, можно определить собственный деструктор класса – метод, объявляемый при помощи ключевого слова destructor и имеющий имя destroy. Деструктор обычно производит освобождение ресурсов перед уничтожением объекта. При разрушении собственного деструктора в класс добавляется код, который будет выполнен перед уничтожением объекта. В собственный деструктор не следует добавлять операции, связанные с освобождением памяти – все связанные с этим процедуры выполняются автоматически. Destroy – это виртуальный деструктор Класса TObject .
Большая часть классов переопределяет этот метод. Не рекомендуется определять другой деструктор класса. Дело в том, что объекты обычно уничтожаются при помощи метода Free, который в свою очередь обращается к виртуальному деструктору Destoy конкретного класса. Free – это метод класса TObject, наследуемый всеми остальными классами. Прежде чем обратиться к destroy, метод free проверяет, не равен ли текущий объект nil. Псевдокод:
procedure TObject.Free; begin if self <> nil then Destroy end;
Как видно из кода, обращение к методу Free не устанавливает ссылку на объект в nil. Поэтому это необходимо делать самостоятельно. Причина: объект не знает, какие именно переменные на него ссылаются. В версиях Delphi, начиная с пятой появилась процедура freeandnil.
procedure FreeAndNil (var Obj1); var P: TObject; begin P:= TObject (Obj1); P.Free; end;
////
Деструктор уничтожает экземпляр класса, который был использован при его вызове, автоматически освобождая любую динамическую память, которая ранее была зарезервирована конструктором, закрывает файлы и т.п. операции. Программист ответственен за вызов деструкторов для всех экземпляров класса, если были зарезервированы подчиненные объекты.
Синтаксис реализации деструктора:
Destructor <имя класса>.<имя деструктора>[(<параметры>)}; [<блок объявлений>] Begin <уничтожение собственных полей> Inherited <имя деструктора>[{<параметры>)]; End;
Примечания: • Внутри деструктора есть доступ не только к обычным идентификаторам, но и к полям экземпляра класса, инкапсулированным при его определении. • Исполняемые операторы деструктора должны позаботиться обо всех операциях очистки, необходимых для уничтожения экземпляра класса. Код деструктора должен уничтожить все внутренние экземпляры объектов и освободить динамическую память, которая была зарезервирована во время существования экземпляра класса. Однако нет необходимости явно устанавливать в нулевые значения поля прямого доступа. • Необходимость в объявлении деструкторов с параметрами возникает очень редко. Обычно все, что нужно сделать деструктору — уничтожить экземпляр класса, и вся необходимая для этого информация и так доступна ему. • Если у класса нет полей косвенного доступа, то деструктор можно не создавать для такого пользовательского класса. • После вызова деструктора объект становится недоступен. Целесообразно присваивать объекту значение Nil сразу после его уничтожения, чтобы в дальнейшем можно было бы проверить его существование. • Не следует вызывать деструкторы непосредственно. Вызов метода Free, наследуемого от TObject.Free, сравнивает указатель экземпляра со значением Nil перед тем, как вызвать деструктор Destroy.
Вызовы конструкторов и деструкторов визуальных компонентов Delphi. Любой компонент, попавший в ваше приложение при визуальном проектировании, включается в определенную иерархию объектов, которая замыкается на форме (класс TFonn). Поэтому вызов конструкторов и деструкторов всех компонентов формы производится автоматически при инициализации и удалении формы, незримо для программиста.
Сами формы создаются и уничтожаются приложением — глобальным объектом с именем Application. В файле-проекте с расширением *.Dpr можно увидеть вызов конструктора формы в виде строки:
