Деструктор
Конструктор
Инициализация и разрушение объекта. Конструктор и деструктор.
Конструктор – это особый метод, который позволяет выполнять некоторую работу, обеспечивающую поддержку механизма виртуальных методов. Он должен вызываться раньше других методов объекта, т.к. он выполняет инициализацию объекта. Вместо слова «procedure» в объявлении объектных типов используется «constructor».
Для объявления конструктора используется зарезервированное слово constructor, после которого идет имя конструктора и параметры, если необходимо. Конструктор возвращает указатель на экземпляр класса. В теле конструктора Вы можете вызвать конструктор предка для инициализации закрытой части предка значениями по умолчанию, например:
Для создания объектов используется расширенный синтаксис вызова функции new, который позволяет выделить память для объекта и инициализировать объект с помощью вызова конструктора. Общий вид инструкции:
Указатель:=new(ТипОбъекта, КонстукторОбъекта);
Для уничтожение объекта служит деструктор. Деструктор объявляется с помощью зарезервированного слова destructor, после которого идет имя деструктора. Деструктор ничего не возвращает и не имеет параметров.
Т.к. объект представляет собой сложную структуру, то рекомендуется использовать метод Done. Метод Done оформляется как деструктор – особая процедура, выполняющая специфическую работу, в том числе обеспечивающая объединение освобождающихся, возможно, небольших участков памяти в более крупные блоки.
Инструкция Dispose(p,Done); уничтожает объект, на который указывает P.
На практике в качестве конструктора используют метод, устанавливающий начальные значения экземпляра объекта. В частности, конструктор может быть пустым. В рассмотренном примере конструктором является метод Init. Конструктор – это обычный метод-процедура, в котором служебное слово procedure заменено на constructor. Он, помимо действий, заданных в его теле, выполняет установочную работу для механизма виртуальных методов, обеспечивая вызов в процессе выполнения программы именно того виртуального метода, который определён для вызывающего объекта. В примере 3 один и тот же метод Moveto будет работать по-разному (передвигать различные фигуры) в зависимости от того, экземпляр какого объектового типа этот метод вызывает. Такое свойство называется полиморфизмом.Полиморфизм возникает на стыке принципов наследования и динамических связей. Полиморфизм означает возможность определения единого по имени метода в каждом объектовом типе иерархической структуры разными способами.Пример 3. Текст программы, использующий виртуальные методы, может быть следующим:Uses Crt, Graph;Var gd,gm : integer;Type Tp=ObjectX,y,c : integer;Constructor Init(ax,ay,ac : integer);
Procedure Show; Virtual;
Procedure Hide; Virtual;
Procedure Moveto(dx,dy : integer);
End;Constructor Tp.Init;
Begin X:=ax; y:=ay; c:=ac End;Procedure Tp.Show;
Begin Putpixel(x,y,c); End;Procedure Tp.Hide;
Begin Putpixel(x,y,Getbkcolor) End;Procedure Tp.Moveto;
BeginDelay(1000); Hide;
X:=x+dx; y:=y+dy; ShowEnd; Type Tc=Object(Tp)R : integer;Constructor Init(ax,ay,ac,ar : integer);
Procedure Show; Virtual;
Procedure Hide; Virtual;
End;Constructor Tc.Init;
Begin Inherited(ax,ay,ac); R:=ar End;Procedure Tc.Show;
BeginSetcolor(c); Circle(x,y,r)End;ProcedureTc.Hide;
BeginSetcolor(Getbkcolor); Circle(x,y,r)End; Var P : Tp; C : Tc;BeginGd:=Detect;Initgraph(Gd,Dm,’c:\bp\bgi’);P.Init(100,120,yellow);
P.Show; P.Moveto(50,50);
Readln;C.Init(200,300,Green,150);
C.Show; C.Moveto(10,10);
Readln;ClosegraphEnd. Пример 4. Приведём пример реализации в виде объекта списка целых чисел. В качестве методов будем использовать следующие: инициализацию списка, добавление в список элемента с заданным значением, обработку элементов списка (печать) и метод, предназначенный для освобождения ранее выделенной памяти.Type Link=^Rec; Rec=Record Inf : Integer; Next : Link End;Tsp=Object Start : Link; Procedure Init; Procedure In_Spisok(X:integer); Procedure Print_Spisok; Procedure Done; End;Procedure Tsp.Init; Begin Start:=NilEnd; Procedure Tsp.In_Spisok;Varp : Link;BeginNew(p); P^.inf:=x; P^.next:=Start;Start:=pEnd; Procedure Tsp.Print_Spisok;Var p : Link;BeginP:=Start;While p<>Nil doBeginWrite(P^.inf:6);P:=P^.nextEnd;End; Procedure Tsp.Done;Var p : Link;BeginWhile Start<> Nil doBeginP:=Start;Start:=Start^.next;Dispose(p)EndEnd; Var Spisok : Tsp; A : integer; Ch : char;BeginSpisok.Init; Repeat Readln(A);Spisok.In_Spisok(A); Readln(Ch); Until Ch in [‘n’,’N’];Spisok.Print_Spisok; Spisok.DoneEnd.Контрольные вопросы
1. Опишите структуру объекта.
2. Дайте определению понятиям «конструктор», «деструктор».