Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции програм_new_последняя версия1.doc
Скачиваний:
14
Добавлен:
14.09.2019
Размер:
697.34 Кб
Скачать

Абстрактные методы.

В классе метод может быть объявлен абстрактным с помощью директивы abstract.

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

В рассмотренном выше ПРИМЕРЕ 1 можно рассмотреть, для чего нужно использование абстрактных методов. Классы, содержащие абстрактные методы, называются абстрактными. Такие классы инкапсулируют общие свойства своих неабстрактных потомков, но объекты абстрактных классов никогда не создаются и не используются. Их абстрактные методы не описываются. Для эксплуатации абстрактных классов в библиотеку классов Delphi включаются классы – потомки, в которых перекрываются абстрактные методы родителя. Таким способом абстрактные классы и абстрактные методы инкапсулируют доступ к методам потомков.

В ПРИМЕРЕ 1 класс TField не используется сам по себе, его абстрактный метод GetData не описывается (не имеет кода). Основное предназначение класса TField – быть родоначальником иерархии конкретных классов-потомков и дать возможность абстрагироваться от частности. Для описания абстрактных методов служит директива abstract, которая записывается после директивы virtual или dynamic.

Таблицы виртуальных и динамических методов – VMT и DMT.

Рассмотрим снова ПРИМЕР 1. Ясно, что у компилятора нет возможности определить класс объекта, фактически переданного в процедуру Show. Нужен механизм для определения класса объекта фактически переданного в процедуру Show, который позволяет определить это прямо во время выполнения программы. Это называется поздним связыванием. В качестве такого механизма служат таблицы VMT и DMT.

Когда компилятор встречает обращение к виртуальному методу, он подставляет вместо прямого вызова по конкретному адресу код, который обращается к VMT и извлекает оттуда нужный адрес. Таблица VMT есть у каждого класса. В ней хранятся адреса всех виртуальных методов класса: и унаследованных от предков, и перекрытых в данном классе.

Отсюда достоинства и недостатки виртуальных методов. Они вызываются сравнительно быстро, однако, для хранения указателей на них в таблице VMT требуется большой объем памяти.

Разница между DMT и VMT механизмами состоит в том, что таблица DMT содержит адреса только тех методов, которые объявлены и перекрыты как dynamic в данном классе. В то время как VMT содержит адреса виртуальных методов не только данного класса, но и всех его предков, независимо от того, унаследованы ли они от предков или перекрыты в данном классе.

Значит бьльшая по размеру таблица VMT обеспечит более быстрый поиск. В то время как при обращении к динамическому методу программа сначала рассмотрит DMT у объекта, а затем, в случае неудачи, у всех классов – предков в порядке иерархии, пока не найдет нужную точку входа.

Итак, динамические методы вызываются медленнее виртуальных, но позволяют экономить память компьютера.