Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Динамические методы

Borland Pascal поддерживает дополнительные методы с поздним

связыванием, которые называются динамическими методами. Динами-

ческие методы отличаются от виртуальных только характером их дис-

петчеризации на этапе выполнения. Во всех других отношениях дина-

мические методы считаются эквивалентными виртуальным.

Описание динамического метода эквивалентно описанию вирту-

ального метода, но описание динамического метода должно включать

в себя индекс динамического метода, который указывается непос-

редственно за ключевым словом virtual. Индекс динамического мето-

да должен быть целочисленной константой в диапазоне от 1 до

656535 и должен быть уникальным среди индексов других динамичес-

ких методов, содержащихся в объектном типе или его предках. Нап-

ример:

procedure FileOpen(var Msg: TMessage); virtual 100;

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

порядку, типа и именам параметров и точно соответствовать типу

результата функции порождающего метода. Переопределение также

должно включать в себя директиву virtual, за которой следует тот

же индекс динамического метода, который был задан в объектном ти-

пе предка.

Примечание: Подробнее о динамических методах и о раз-

нице в диспетчеризации динамических и виртуальных методов

рассказывается в Главе 22.

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

Экземпляр объекта создается посредством описание переменной

или константы объектного типа или путем применения стандартной

процедуры New к переменной типа указатель на объектный тип. Ре-

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

var

F: TField;

Z: TZipField;

FP: PField;

ZP: PZipField;

С учетом этих описание переменных F является экземпляром

TField, а Z - экземпляром TZipField. Аналогично, после применения

New к FP и ZP, FP будет указывать на экземпляр TField, а ZP - на

экземпляр TZipField.

Если объектный тип содержит виртуальные методы, то экземпля-

ры этого объектного типа должны инициализироваться посредством

вызова конструктора перед вызовом любого виртуального метода. Ни-

же приведен пример:

var

S: StrField;

begin

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

S.Put ('Френк');

S.Display;

...

S.Done;

end;

Если S.Init не вызывался, то вызов S.Display приведет к неу-

дачному завершению данного примера.

Присваивание экземпляра объектного типа не подразумевает

инициализации экземпляра.

Объект инициализируется кодом, генерируемым компилятором,

который выполняется между вызовом конструктора, и когда выполне-

ние фактически достигает первого оператора в блоке кода конструк-

тора.

Если экземпляр объекта не инициализируется, и проверка диа-

пазона включена (директивой {$R+}), то первый вызов виртуального

метода экземпляра объекта дает ошибку этапа выполнения. Если про-

верка диапазона выключена (директивой {$R-}), то первый виртуаль-

ного метода неинициализированного объекта может привести к неп-

редсказуемому поведению.

Правило обязательной инициализации применимо также к экземп-

лярам, которые являются компонентами структурных типов. Например:

var

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

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 ('Френк');

SP^.Display;

.

.

.

Dispose (SP, Done);

end;

Указатель на объектный тип является совместимым по присваи-

ванию с указателем на любой родительский объектный тип, поэтому

во время выполнения программы указатель на объектный тип может

указывать на экземпляр этого типа или на экземпляр любого дочер-

него типа.

Например, указатель типа ZipFieldPtr может присваиваться

указателям типа PZipField, PNumField и PField, а во время выпол-

нения программы указатель типа PField может либо иметь значение

nil, либо указывать на экземпляр TField, TNumField или TZipField,

или на любой экземпляр дочернего по отношению к TField типа.

Эти правила совместимости указателей по присваиванию приме-

нимы также к параметрам-переменным объектного типа. Например, ме-

тоду TField.Copy могут быть переданы экземпляры типов TField,

TStrField, TNumField, TZipField или любые другие экземпляры до-

чернего от TField типа.

Соседние файлы в предмете Программирование на Pascal