Динамические методы
В Паскале имеется дополнительный класс методов позднего связывания -динамические методы. Они являются подклассом виртуальных методов и отличаются от них только способом вызова на этапе выполнения.
Объявление динамического метода аналогично виртуальному, за исключением того, что оно должно включать индекс (номер) динамического метода, который указывается сразу за ключевым словом Virtual. Индекс динамического метода должен быть целочисленной константой в диапазоне от 1 до 65535 и представлять собой уникальное значение среди индексов других динамических методов данного объектного типа и его предков. Например:
Function GetSum: Real; Virtual 10; где - 10 - ИНДЕКС.
Переопределение динамического метода аналогично переопределению виртуального. Оно должно включать слово Virtual, за которым следует тот же индекс, что и в переопределяемом динамическом методе предка.
Использование динамических методов целесообразно при создании длинной иерархии объектов с большим количеством виртуальных методов. Если не использовать динамические методы, для них создаются длинные таблицы виртуальных методов с указанием всех виртуальных методов-предков, хотя переопределяться может только часть из них. Это требует большого объема ОП.
При использовании динамических методов создается таблица динамических методов (ТДМ, DMT - Dynamic Method Table), альтернативная таблице виртуальных методов. В ней указываются только те виртуальные методы, которые переопределяются. Это экономит ОП, но требуется время для поиска в DMT объектов-предков. Поэтому производительность DMT ниже, чем VMT, так как доступ к методу через VMT - простое извлечение адреса из таблицы, а доступ к методу через DMT может привести к более длительному поиску.
Выбор типа метода
Прежде чем разрабатывать программу с использованием ООП, надо разработать иерархию типов. Определяя иерархию типов, надо собрать все общие атрибуты, в один тип-предок и позволить остальным типам иерархии наследовать все общие элементы этого типа.
При выборе типа метода, статического или виртуального, можно использовать следующее правило: если есть хотя бы малейшая вероятность того, что понадобится из метода предка вызов переопределенного метода потомка, целесообразно делать метод виртуальным.
Преимуществом использования виртуальных методов является то, что типы объектов и методы можно определить в модуле и поставить пользователю модуль в виде TPU-файла. Для работы с объектами модуля надо знать содержимое только интерфейсной части модуля. Используя полиморфные объекты и виртуальные методы, пользователь TPU-файла может добавлять новые методы к уже существующим.
Добавление новых функциональных характеристик в программу без модификации ее исходного кода (текста) называют способностью к расширению. Это - результат наследования. Позднее связывание позволяет связать новые методы с существующими во время выполнения программы, требуя лишь небольшого увеличения ТВМ.
Не следует сомневаться в том, включать или не включать в объект метод, который может быть использован или не использован в конкретной программе. Неиспользуемые методы не влияют ни на быстродействие программы, ни на размер ЕХЕ-файла: если они не используются, то они не включаются в него.
В общем случае рекомендуется делать методы виртуальными. Но они требуют ОП для ТВМ. Кроме того, каждый вызов виртуального метода проходит через ТВМ и требует для этого дополнительное время. Использование статических методов имеет смысл, если надо получить оптимальную эффективность программы по скорости ее выполнения и использованию ОП. Статические методы вызываются непосредственно. Поэтому вызов статического метода более быстрый, чем вызов виртуального. Если в объекте нет виртуальных методов, в сегменте данных отсутствует ТВМ и программа будет работать быстрее. Однако в этом случае теряется вариант расширения возможностей на этапе выполнения программы, при позднем связывании.
Дата добавления: 2019-12-09; просмотров: 689;