Конструкторы и деструкторы

Среди всех методов класса выделяют две особых группы, имеющих особое значение при создании и удалении объектов этого класса:

- конструкторы;

- деструкторы

Конструкторы предназначены для инициализации полей объектов в момент их создания. Объявляются они следующим образом:

Type Class4 = Object

 

B: Byte;
Constructor Init(CB: Byte);
Destructor Done; Virtual;
End;

 

Constructor Class3.Init(CB: Byte);
Begin B:= VB;

 

End;
Destructor Class3.Done;
Begin
End;

Заметим, что в вышеприведенном примере определен также и виртуальный деструктор. Назначение деструкторов обратно назначению конструкторов - выполнять некоторые действия при удалении объектов. Конструкторы, в отличие от деструкторов не могут быть виртуальными.

Несмотря на то, что как конструктор, так и деструктор могут быть вызваны непосредственно, их специфическое назначение привело к появлению возможности вызова их параллельно с созданием/удалением объектов. Так как создание/удаление объектов в процессе выполнения программы на Pascal'е возможны только при использовании ДРП, то функции создания/удаления типизированных переменных имеют дополнительный синтаксис (см. соответствующий урок):

{... }
Type PClass4 = ^Class4;

 

Var P: PClass4;

 

{... }
Begin P:= New(PClass4, Init(4));
{... }
Dispose(P, Done);

 

End;

Именно здесь мы впервые встретились с возможностью с помощью одной и той же переменной получить доступ к объектам различных классов. Действительно, в зависимости от хода алгоритма указателю P может быть присвоено значение адреса как объекта класса Class4, так и адреса объекта класса-наследника от Class4.

Перекрытие методов

Перекрыть метод предка в классе наследнике очень просто: продекларировать метод с тем же именем.

Type Class5 = Object(Class1)

 

Procedure Nothing;
End;

 

При этом если перекрывается метод виртуальный, то перекрывающий метод тоже обязан быть виртуальным и, кроме того, иметь тот же список параметров. Если требование объявлять перекрывающий метод виртуальным введено, вероятно, для того, чтобы программист не забывал о его унаследованной виртуальности (компилятор вполне в состоянии самостоятельно определить, является ли перекрываемый метод витруальным), то второе - требование одинаковости списка параметров - насущно необходимо: при вызове виртуального метода для любого объекта любого класса-наследника компилятор может генерировать код передачи одинакового списка параметров - ведь заранее неизвестен реальный тип объекта.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: