Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебник_Часть_2.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1.12 Mб
Скачать

Наследование

Pascal не поддерживает множественного наследования, т. е. каждый класс может иметь не более одного наследника. Для того чтобы объявить класс наследником какого-то другого класса, достаточно указать имя класса-предка при объявлении наследника:

Type

Class2 = Object(Class1)

M: Integer;

End;

Var

Object3: Class2;

При таком объявлении объект Object3 обладает тремя полями - A, V, M и одним методом Nothing(Var Byte).

Методы

Методы объектов обладают единственным отличием от обычных процедур (функций): они, собственно, принадлежат объектам. Следовательно, они обладают доступом к полям именно «своего» объекта. Так как объектов в программе может быть множество, то во избежание дублирования кода каждый метод получает в качестве неявного параметра указатель на объект, для которого он вызван. Данный указатель доступен в теле метода как @Self. Естественно, что объявленный (декларированный) при определении класса метод должен быть определен (дефинирован) в программе. Делается это примерно следующим образом:

Procedure Class1.Nothing(Var K: Byte);

Begin

{body of method}

V:= K;

@Self^.V:= K;

End;

Третья и четвертая строки абсолютно идентичны. В сущности, третья является лишь удобным сокращением второй.

Известно, что все методы класса делятся на обычные (статические) и виртуальные. Любой метод считается статическим, если не указано обратное. Указать же, что метод является виртуальным можно, указав после его декларации в дефиниции класса ключевое слово Virtual:

Type

Class3 = Object

Procedure Nothing(Var K: Byte);

Virtual;

End;

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

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

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

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

  • деструкторы.

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

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;

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

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

{ . . . }

Type

PClass4 = ^Class4;

Var

P: PClass4;

{ . . . }

Begin

P:= New(PClass4, Init(4));

{ . . . }

Dispose(P, Done);

End;

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