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

Перекрытие виртуальных и динамических методов.

Для перекрытия виртуальных и динамических методов служит новая директива override, с помощью которой и только с ней можно переопределить оба этих типа методов.

Пример 2:

Type TFirstClass=class

FMyField1:Integer;

FMyField2:LongInt;

Procedure StatMetod;

Procedure VirtMetod1; virtual;

Procedure VirtMetod2; virtual;

Procedure DynaMetod1; dynamic;

Procedure DynaMetod2; dynamic;

end;

TSecondClass=class(TFirstClass) {класс потомок}

Procedure StatMetod;

Procedure VirtMetod1; override;

{метод перекрыт}

Procedure DynaMetod1; override;

{метод перекрыт}

end;

Var Object1:TFirstClass;

Object2:TSecondClass;

Первый из методов StatMetod создается в новом классе заново {перекрывается статически}, остальные два перекрываются как виртуальный и динамический с помощью директивы override. Попытка применить директиву override к статическому методу вызовет ошибку компиляции.

Как устроен объект изнутри

Рассмотрим, как устроен объект изнутри и как происходит вызов методов в этом примере. Ясно, что каждый экземпляр класса (объект) содержит отдельную копию всех его полей. Ясно также, что внутри экземпляра есть указатели на таблицы VMT и DMT.

Нарисуем структуру объектов Object1 и Object2:

Object1

У казатель на объект Object1

Указатель на класс TFirstClass

Поле FMyField1

Поле FMyField2

Число динамических методов (2)

Индекс метода TFirstClass.DynaMetod1

(-1)

Индекс метода TFirstClass.DynaMetod2

(-2)

Адрес метода TFirstClass.DynaMetod1

Адрес метода TFirstClass.DynaMetod2

И нформация класса TFirstClass

Адрес метода TFirstClass.VirtMethod1

Адрес метода TFirstClass.VirtMethod2


Object2

У казатель на объект Object2

Указатель на класс TSecondClass

Поле FMyField1

Поле FMyField2

Информация класса

T SecondClass

Адрес метода TSecondClass.VirtMethod1

Адрес метода TSecondClass.VirtMethod2

Число динамических методов (1)

Индекс метода TSecondClass.DynaMetod1

(-1)

Адрес метода TSecondClass.DynaMetod1


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

Отметим, что в объектах Object1 и Object2 длина таблиц VMT одинакова, в них по два элемента. Перед каждой VMT располагается специальная структура – информация класса. Одно из полей информации класса содержит адрес таблицы DMT класса. Таблица DMT имеет следующий формат: в начале – количество элементов таблицы, затем – индексы методов, нумерация которых начинается с (-1) и идет по убывающей. После индексов идут адреса динамических методов. Обратим внимание, что DMT объекта Object1 состоит из двух элементов, а объекта Object2 – из одного метода, соответствующего перекрытому методу DynaMetod1 в данном классе.

Внимание! В случае вызова Object2.DynaMetod2 индекс и адрес его не будут найдены в DMT Object2, тогда произойдет обращение к таблице DMT объекта Object1, в которой содержится адрес нужного метода DynaMetod2. В случае вызова Object2.VirtMetod2 адрес его сразу будет найден в таблице VMT объекта Object2.

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

Итоги:

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

Полиморфизм – это свойство родственных классов решать схожие по смыслу проблемы разными способами.

В ООП действуют следующие правила описания и наследования методов:

  1. Служебные слова virtual и dynamic вводят (описывают) новый виртуальный или динамический метод;

  2. Для перекрытия наследуемого статического метода никаких дополнительных служебных слов не используется. Но если в порожденном классе надо перекрыть наследуемый виртуальный или динамический метод используется служебное слово override;

  3. В одноименных статических методах порожденных классов списки параметров могут отличаться. Списки параметров виртуальных и динамических методов порождающих и порожденных классов должны быть идентичными.