В процессе разработки программы вам, возможно, захочется повысить меры безопасности, которая снижается из-за вызовов виртуальных методов Borland Pascal. Если директива $R находится во включенном состоянии, {$R+}, то все вызовы виртуальных методов будут проверяться на состояние инициализации для выполняющих вызовы реализаций. Если выполняющая вызов реализация еще не была инициализирована конструктором, то произойдет ошибка проверки диапазона исполняющей системы.
Примечание: Состоянием по умолчанию является {$R-}.
После того, как вы хорошенько перетрясли программу и удостоверились, что отсутствуют вызовы методов из неинициализированных реализаций, вы можете до некоторой степени ускорить выполнение программы путем переключения директивы $R в пассивное состояние. После этого проверка вызовов методов из неинициализированных реализаций осуществляться не будет, что оставляет вероятность блокировки системы, если будет выявлена такая ошибка.
Виртуальный однажды - виртуальный всегда
Вы уже вероятно обратили внимание, что как TWinged, так и TBee содержат методы, называемые Show и Hide. Все заголовки методов для Show и Hide объявлены виртуальными и снабжены зарезервированным словом virtual. Как только родительский тип объекта объявляет метод виртуальным, все его потомки также должны объявить этот метод виртуальным. Другими словами, статический метод никогда не сможет переопределить виртуальный метод. Если вы попытаетесь сделать это, то компилятор выдаст сообщение об ошибке.
Также следует помнить, что после того, как метод стал виртуальным, его заголовок не может изменяться в объектах более низкого уровня иерархии. Вы можете представлять себе каждое определение виртуального метода как ворота для всех их. Исходя из этих соображений, заголовки всех реализаций одного и того же виртуального метода должны быть идентичными, включая число параметров и их типы. Это не относится к статическим методам: статический метод, переопределяющий другой, может иметь отличное число параметров и типы этих параметров, в зависимости от необходимости.
Это целый новый мир.
Расширяемость объекта
Важным замечанием, касающимся модулей типа WORKERS.PAS, является то, что типы объектов и методы, определенные в модуле, могут поставляться пользователю в форме .TPU, .TPW или .TPP т.е. в форме, способной к непосредственной компоновке, без исходного кода. (Нужно просмотреть только листинг интерфейсной части модуля.) Используя полиморфические объекты и виртуальные методы, пользователь файла .TPU, .TPW или .TPP сможет добавлять характеристики для приспособления модуля к своим нуждам.
Новое понятие о добавлении функциональных характеристик в программу без предоставления ее исходного кода называется способностью к расширению. Способность к расширению является естественным следствием наследования: вы наследуете все, чем обладают порождающие типы, а затем добавляете новые нужные вам возможности. Позднее связывание позволяет, чтобы новое связывалось со старым во время выполнения программы, благодаря чему расширение существующего кода выглядит "бесшовным" и стоит вам в части выполнения не более, чем быстрое путешествие по таблице виртуального метода.
8 8 8
| |