Создание экземпляров объектов

Экземпляр объекта создается посредством описание переменной или константы с типом объектового типа или путем применения стандартной процедуры New к переменной типа указатель на объектовый тип. Результирующий объект называется экземпляром объектового типа.

Var

F: Field;

Z: ZipField;

FP: FieldPtr;

ZP: ZipFieldPtr;

С учетом этих описаний переменных F является экземпляром Field, а Z - экземпляром ZipField. Аналогично, после применения New к FP и ZP, FP будет указывать на экземпляр Field, а ZP - на экземпляр ZipField.

Если объектовый тип содержит виртуальные методы, то экземпляры этого объектового типа должны инициализироваться посредством вызова конструктора перед вызовом любого виртуального метода. Ниже приведен пример:

Var

S: StrField;

Begin

S.Init (1, 1, 25, 'Первое имя');

S.Put ('Ah'yr');

S.Display;

...

S.Done;

End;

Если метод S.Init не вызывался, то вызов S.Display приведет в неудачному завершению данного примера.

Важное замечание: Присваивание экземпляра объектового типа не подразумевает инициализации экземпляра.

Правило обязательной инициализации применимо также к экземплярам, которые являются компонентами структурных типов. Например:

Var

Comment: array [1..5] of StrField;

I: integer;

Begin

for I := 1 to 5 do

Comment [I].Init (1, I + 10, 40, 'первое_имя');

...

for I := 1 to 5 do

Comment [I].Done;

End;

Для динамических экземпляров инициализация, как правило, связана с размещением, а очистка - с удалением, что достигается благодаря расширенному синтаксису стандартных процедур New и Dispose. Например:

Var

SP: StrFieldPtr;

Begin

New (SP, Init (1, 1, 25, 'первое_имя');

SP^.Put ('Ah'yr');

SP^.Display;

...

Dispose (SP, Done);

End;

Указатель на объектовый тип совместим по присваиванию с указателем на любой родительский тип, поэтому во время выполнения программы указатель на объектовый тип может указывать на экземпляр этого типа или на экземпляр любого порожденного (производного) типа.

Например, указатель типа ZipFieldPtr может присваиваться указателям типа ZipFieldPtr, NumFieldPtr и FieldPtr, а во время выполнения программы указатель типа FieldPtr может либо иметь значение nil, либо указывать на экземпляр Field, NumField или ZipField, или на любой экземпляр производного по отношению к Field типа.

Эти правила совместимости указателей по присваиванию применимы также к параметрам-переменным объектового типа. Например, методу Field.Copy могут быть переданы экземпляры типов Field, StrField, NumField, ZipField или любые другие экземпляры производного от Field типа.

Метод активизируется посредством определителя (десигнатора) метода, который представляется в форме Экземпляр. Метод, где "Экземпляр" является одним из экземпляров объектового типа, а "Метод" является методом объектового типа.

Для статических методов объявляемый (определяется во время компиляции) тип экземпляра определяет, какой метод должен быть активизирован. Например, определители F.Init и FP.Init всегда будут активизировать метод Field.Init, так как описанным типом для F и FP является Field.

Для виртуальных методов выбором управляет действительный (определяемый во время выполнения) тип экземпляра. Например, десигнатор FP.Edit может активизировать Field.Edit, StrField.Edit или ZipField.Edit, в зависимости от действительного типа экземпляра, на который указывает FP.

В общем случае, не существует никакого способа определить, какой метод был активизирован десигнатором виртуального метода. Вы можете разработать программу (аналогичную программе ввода бланков редактора), которая активизирует FP.Edit, а затем, без модификации этой программы, применить ее к экземпляру нового, непредвиденного дочернего по отношению к Field типа. Если желательна такого рода возможность расширения, то вам следует применять объектовый тип с открытым для расширения множеством производный типов, а не тип записи с ограниченным множеством вариантов.

Задание для самостоятельного выполнения:

Написать программу, используя объектовые типы данных, а также свойства наследования и переопределения. (Например: с использованием графического модуля Turbo Pascal – точка-линия-фигура и т. п.; создание и редактирование файлов(См. Л. р. №5))

Наши рекомендации