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

Активизация методов

Метод активизируется посредством оператора вызова процедуры

или функции, состоящего из десигнатора метода, за которым следует

список параметров. Такой тип вызова называется активизацией мето-

да.

десигнатор метода

¦ ---------------------

L-T-------------------------------------->¦идентификатор метода+>

¦ ^ L---------------------

¦ ----------------------- ---- ¦

L>¦ ссылка на переменную +>¦ . +-----

L----------------------- L----

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

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

жен обозначать метод этого объектного типа.

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

явным фактическим параметром метода; он соответствует формальному

параметру-переменной с именем Self, который владеет объектным ти-

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

Для статических методов описанный тип (на этапе компиляции)

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

ры F.Init и FP^.Init всегда активизируют TField.Init, так как

описанным типом F и FP^ является TField.

Для виртуальных методов выбором экземпляра управляет факти-

ческий тип (этапа выполнения). Например, десигнатор FP^.Display

может активизировать методы TField.Display, TStrField.Display,

TNumField.Display или TZipField.Display (в зависимости от факти-

ческого типа экземпляра, указываемого FP).

В операторе with, ссылающемся на экземпляр объектного типа,

ссылка на переменную в десигнаторе метода может опускаться. В

этом случае экземпляром, на который ссылается оператор with, ста-

новится неявный параметр Self активизации метода. Аналогично,

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

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

раметр Self активизации метода.

Активизация уточненных методов

В методе, операторе вызова функции или процедуры для обозна-

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

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

визацией уточненного метода.

десигнатор уточненного метода

¦ ----------------------- ---- ---------------------

L-T>¦ идентификатор +>¦ . +------->¦идентификатор метода+>

¦ ¦ объектного типа ¦ L---- ^ L---------------------

¦ L----------------------- ¦

¦ ----------------------- ¦

L>¦ inherited +-----------

L-----------------------

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

должен быть таким же, как и включающий метод объектный тип, или

соответствовать родительскому типу.

Для обозначения родительского объектного типа или объектного

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

inherited; в методах объектного типа, не имеющего предка, ключе-

вое слово inherited использоваться не может.

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

вится параметром Self метода, содержащего вызов. Активизация

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

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

зывает заданный метод.

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

ределяющем методе для активизации переопределяющего метода. С

учетом описанных выше типов приведем некоторые примеры активиза-

ции уточненных методов:

constructor TNumField.Init(Fx, FY, Flen: Integer;

FName: String; FMin, FMax: Longint);

begin

inherited Init(FX, FY, FLen, FName);

Value := 0;

Min := FMin;

Max := FMax;

end;

function TZipField.PutStr(S: String): Boolean;

begin

PutStr := (Length(S) = 5) and TNumField.PutStr(S);

end;

Как показывают эти примеры, активизация уточненных методов

позволяет переопределяющему методу "вновь использовать" код мето-

да, который он переопределяет.

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