- •Основы объектно-ориентированного анализа и проектирования Введение в объектно-ориентированное программирование Эволюция разработки программного обеспечения
- •Технологии программирования
- •Основные концепции объектно-ориентированного программирования
- •Реализация объектно-ориентированного подхода Инкапсуляция. Свойства
- •При использовании динамики:
- •Конструкторы объектов
- •Деструкторы объектов
- •Наследование, агрегация
- •Полиморфизм, виртуальные и динамические методы
- •Абстрактные методы
- •Перегрузка методов
- •События и делегирование
- •Приведение объектных типов, операторы is и as
- •Области видимости
- •Перекрытие и переопределение свойств
- •Объектно-ориентированное программирование в Borland Delphi. Применение объектно-ориентированного программирования
- •Иерархия библиотечных классов в Borland Delphi.
- •Создание компонентов в среде Delphi Способы создания компонентов
- •Процесс создания компонентов
- •Создание модуля
- •Создание описания и реализации класса для компонента
- •Тестирование неустановленного компонента
- •Создание графического изображения для компонента
- •Инсталляция и деинсталляция компонента
- •Создание свойств, событий и методов компонентов Работа со свойствами
- •События
- •Обработка сообщений Windows
- •Сообщения Windows
- •Обработчики сообщений Windows
Деструкторы объектов
Как было сказано ранее объекты, т.е. переменные типа класс, создаются путем вызова конструктора. В Object Pascal все переменные типа класс динамические, поэтому конструктор должен быть вызван явно. В допускающих статические переменные типа класс, для таких объектов вызов конструктора автоматически. В любом случае при вызове конструктора происходит распределение памяти поля объекта и инициализация параметров. А, как известно, распределенная память должна быть освобождена. Причем должна быть освобождена как память, занятая непосредственно полями объекта, так и им для своих целей динамическая память. Кроме того должны быть освобождены используемые объектом ресурсы, например файлы. Эти операции осуществляются с помощью деструкторов. Для динамических объектов деструкторы должны вызываться явно. Для статических, если такие, деструкторы будут вызваны автоматически при выходе из блока, где была объявлена переменная типа класс.
Деструктор — это специальный метод, который уничтожает тот объект, для которого был вызван и освобождает память. Описание деструктора подобно описанию процедуры, но начинается со слова destructor.
Например: destructor Destroy;
Хотя класс может иметь более чем один деструктор, рекомендуется для каждого класса иметь только один деструктор, именуемый Destroy.
Вызов деструктора осуществляется через тот объект, который должен быть уничтожен (а не класс как в случае конструктора) Например:
Var
MyObject:TMyObject;
. . .
MyObject.Destroy;
При вызове деструктора в первую очередь выполняются операторы, описанные в деструкторе. Обычно они содержат освобождение динамической памяти, на которую ссылаются поля объекта, и освобождение ресурсов, которые были предоставлены объекту, например закрытие файлов. Затем освобождается память, распределенная под сам объект. В Object Pascal для уничтожения объектов рекомендуется использовать унаследованный метод Free, который первоначально проверяет указатель (не равен ли он nil), а затем вызывает Destroy.
Приведем пример Дополним описание класса стек из прошлых примеров деструктором.
1. Стек в массиве
TSObStack = class(TObject)
Stack:array[1..1000] of TElem;
Top:integer;
Constructor Create; {по умолчанию}
Destructor Destroy;
procedure InStack(Elem: TElem}:boolean;
function OutStack(var Elem:TElem):Boolean;
end;
Constructor TSObStack .Create;
Begin
Top:=0; {можно было и не делать}
{конструктор по умолчанию не нужен}
End;
Destructor TSObStack.Destroy;
Begin
{никакие действия не нужны}
End;
2. Динамический стек
TDObStack=class(TObject)
Top:TERef;
Constructor Create; {по умолчанию}
Destructor Destroy;
procedure InStack(Elem: TElem}:boolean;
unction OutStack(var Elem:TElem):Boolean;
end;
Constructor TDObStack .Create;
Begin
Top:=nil; {можно было и не делать}
{ конструктор по умолчанию не нужен}
End;
Destructor TDObStack.Destroy;
Var
Elem:TElem;
Begin
While OutStack(Elem) do;
End;
Использование:
Var
DStack:TDObStack;
SStack:TSObStack;
. . .
A:TElem;
Begin
DStack:=TDObStack.Create;
SStack:=TSObStack.Create;
{использование}
DStack.Destroy;
SStack.Destroy
End.
В завершение рассмотрения конструкторов и деструкторов следует отметить следующее: если взять любую программу, написанную на Borland Pascal, использующую большое число стандартных визуальных компонент, которые являются объектами, вы почти не увидите там вызовов конструкторов и деструкторов. Дело в том, что любой компонент, попавший при визуальном проектировании в приложение из палитры компонентов, включается в определенную иерархию. Иерархия эта замыкается на форме: для всех ее составных частей конструкторы и деструкторы вызываются незримо для программиста. За создание и уничтожение самой формы отвечает приложение (глобальный объект с именем Application). В файле проекта (с расширением DPR.) вы можете увидеть вызов метода Application. CreateForm, предназначенного для выполнения этой цели. Что же касается объектов, создаваемых динамически (во время выполнения приложения), то здесь нужен явный вызов конструктора и деструктора или метода Free.