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



         

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


рrocedure TWinged.MoveTo(NewX, NewY: Integer); begin Hide; X := NewX; {новая координата X на экране} Y := NewY; {новая координата Y на экране} Show; end;

рrocedure TBee.MoveTo(NewX, NewY: Integer); begin Hide; X := NewX; {новая координата X на экране} Y := NewY; {новая координата Y на экране} Show; end;

Не изменилось ничего, кроме копирования программы и поста- новки квалификатора TBee перед идентификатором MoveTo. Так как методы одинаковы, зачем нужно помещать MoveTo в TBee? Ведь Bee автоматически наследует MoveTo от TWinged. Поэтому не нужно переопределять метод MoveTo из TWinged, но это именно то место, где возникает проблема в случае статических методов.

Термин "статический" был выбран для описания методов, не яв- ляющихся виртуальными - термин, который мы введем далее. Факти- чески, виртуальные методы являются решением этой проблемы, но прежде чем понять решение, вам следует разобраться в самой проб- леме.

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

Почему это так? Это объясняется способом, которым компилятор разрешает вызовы методов. Когда компилируются методы Bee, то сна- чала встречаются TWinged.Show и TWinged.Hide и их код компилиру- ется в сегмент кода. Немного позднее в файле встречается метод Winged.MoveTo, который вызывает TWinged.Show и TWinged.Hide. Как и при вызове любой процедуры, компилятор замещает ссылки на TWinged.Show и TWinged.Hide в исходном коде на их адреса, сгене- рированные в сегменте кода. Таким образом, когда вызывается код TWinged.MoveTo, он, в свою очередь, вызывает TWinged.Show и TWinged.Hide со всеми вытекающими последствиями.




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