Borland Pascal. Руководство пользователя



         

Наследование статических методов - часть 3


До сих пор это был типичный для Borland Pascal сценарий и он был бы справедлив (за исключением номенклатуры), начиная с версии 1.0 Turbo Pascal 1983 года. Однако, дело меняется, когда вы вклю- чаете в этот сценарий принцип наследования. Когда TBee наследует метод от TWinged, он (TBee) использует метод в точности так, как тот был откомпилирован.

Снова посмотрите, что должен наследовать TBee, если он нас- ледует TWinged.MoveTo:

рrocedure TWinged.MoveTo(NewX, NewY: integer); begin Hide; { Вызов Winged.Hide } X := NewX; Y := NewY; Show { Вызов Winged.Show } end;

Комментарии здесь приведены для того, чтобы подчеркнуть тот факт, что если Bee вызывает метод TWinged.MoveTo, то он также вы- зывает TWinged.Show и TWinged.Hide, а не TBee.Show и TBee.Hide. Поскольку TWinged.MoveTo вызывает методы TWinged.Show и TWinged.Hide, TWinged.MoveTo нельзя наследовать. Вместо этого, он должен быть переопределен своей второй копией, которая вызывает копии Show и Hide, определенные внутри области действия второй копии, то есть, TBee.Show и TBee.Hide.

При разрешении вызовов методов, логика компилятора работает так: при вызове метода компилятор сначала ищет метод, имя которо- го определено внутри типа объекта. Тип TBee определяет методы с именами Init, Hide, Show и MoveTo. Если метод TBee должен был вызвать один из этих четырех методов, то компилятор заменил бы вызов на адрес одного из собственных методов Bee.

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

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




Содержание  Назад  Вперед