Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика / inf-ka_shpory.doc
Скачиваний:
67
Добавлен:
13.02.2015
Размер:
642.56 Кб
Скачать

7) Концепция полиморфизма и ее применение на основе виртуальных и динамических методов.

Полиморфизм – механизм, к-ый позволяет исп-ть одно и тоже имя для решения схожих, но технически различных задач. Важнейший принцип полиморфизма можно сформулировать фразой: «один интерфейс, несколько методов».

Например, при нахождении круга, треугольника и прямоугольника необходимо исп-ть 3 метода с различными именами: Circle square, Triangle square, Rectangle square.

Т.е. все эти методы решали бы одну и туже задачу нахождения площади, но внутри реализация их была бы различна для каждой фигуры.

Концепция полиморфизма позволяет использовать одно имя для всех трех методов (square). При этом площадь конкретно какой фигуры будет найдена (какой из трех методов будет вызван), опр-ся автоматически компилятором. Механизм исп-ния одного и того же имени для различных методов наз-ся перегрузкой (overloading). Механизм полиморфизма позволяет упростить создание сложных программ за счет того, что программисту нет необходимости запоминать огромное число названий ф-ий, а достаточно помнить только узкий круг из них.

Концепция пол-зма реализуется в Delphi на основе виртуальных и динамических методов. ВДМ объявляются внутри класса так же, как и статич. с прибавлением директив virtual и dynamic.

procedure <имя>(<сп пар>); dynamic; или virtual;

function <имя>(<сп пар>): <тип возвр-го зн-я>; dynamic; или virtual;

В отлич. от статич. методов класса адреса виртуальных становятся известными только во время выполнения программы, поэтому они не сразу подст-ся вместо <имени метода>,а помещаются в спец. таблицу VMT(таблица вирт. методов), к-ая находится внутри каждого класса. Кроме этого в VMT помещаются адреса всех виртуальных методов, объявленных не только в данном классе, но и во всех его родителях, адреса этих методов опр-ся в строго опр-ном порядке, начиная с 1ого виртуального самого первого родительского класса и заканчивая последним методом данного класса. Т.е. при объявлении любого класса он сначала наследует таблицу vmt родителя, а затем добавляет в нее свои виртуальные методы. Т.о. если иерархич цепочка наследования будет достаточно большой, то на хранение таблицы потребуется большое кол-во затраты опер памяти.

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

Описание виртуального метода выглядит след образом:

type TComponent = class

procedure MyProcedure; virtual;

end;

Динамические методы похожи на виртуальные, они также могут быть перегружены. Основная разница между виртуальными и динамическими методами - в способе их вызова. Если для виртуальных методов строится таблица виртуальных методов, то каждому динамическому методу присваивается уникальное число-идентификатор, после чего строится таблица динамических методов (Dynamic Method Table), в которую заносится данное число, а также адрес метода. При замене имени динамич м-да компил-р ищет соотв номер, и если он найден, то берет адрес из след. строки. Если внутри данн. класса указ номер не найден, то компил-р обратится к т-це DMT родит класса, и так далее вверх по иерарх цепочке. Если номера нет нигде, то в базовом классе TObject определен обработчик дин. м-дов по умолчанию. Еще одно отличие динамических методов от виртуальных заключается в том, что таблицы динамич методов содержат методы только одного компонента или класса (не включая его предков).

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

Описание динамического метода может выглядеть так:

type TComponent = class

procedure MyProcedure; dynamic;

end;

Соседние файлы в папке Информатика