Статические и виртуальные методы.
Методы класса могут перекрываться в потомках. Например:
Type
TParentClass = class
Procedure DoWork;
end;
TChildClass = class(TParentClass)
Procedure DoWork;
end;
Потомки классов могут выполнять сходную по названию процедуру DoWork, но , в общем случае,будут это делать по разному. Такое перекрытие методов называется статическим, так как реализуется компилятором.
В Delphi гораздо чаще используется динамическое перекрытие методов на этапе прогона прогрыммы. Для реализации этого метода, перекрываемый в родительском классе, должен объявляться как динамический (с директивой dynamic) или виртуальный (virtual). Встретив такое объявление компилятор создаст дву таблицы – DMT и VMT и поместит в них адреса точек входа соответственно динам. и вирт. методов. При каждом обращении к перекрываемому методу компилятор вставляет код, позволяющий извлечь из той или иной таблицы адрес точки входа в программу. В классе-потомке перекрываемый метод объявляется с директивой override.
Получив это указание, компилятор создаст код, который на этапе прогона программы поместит в родительскую таблицу точку входа класса-потомка, что позволит родителю выполнить нужное действие с помощью нового метода.
Type
TVisualObject = class(TWinControl)
Procedure Hide;
Procedure Show
Procedure Draw(IsShow: Boolean);virtual;
end;
TVisualChildObject = class(TVisualObject)
Procedure Draw (IsShow: Boolean);override;
end;
Реализация методов Show и Hide :
Procedure TVisualObject.Show;
begin
Draw(True);
end;
Procedure TVisualObject.Hide;
begin
Draw(False);
end;
Методы Draw у родителя и потомка имеют разную реализацию и создают разные изображения. В результате родительские методы Show и Hide будут прятать или показывать те или иные изображения в зависимости от конкретной реализации метода Draw у любого из своих потомков. Динамическое связывание в полной мере реализует полиморфизм классов.
Раннее связывание – размещение ссылок на методы на этапе компиляции; сами методы называются статическими.
Позднее связывание - размещение ссылок на методы при выполнении программы (а не при компиляции), а сами методы называются виртуальными.
Таблицы виртуальных и динамических методов.
Таблица виртуальных методов (VMT)
Для виртуальных методов, объявленных в классе, на этапе компиляции в сегменте данных создается особый информационный блок - таблица виртуальных методов (Virtual Method Table, далее VMT), содержащая список указателей на подпрограммы, реализующие эти методы.
Каждый экземпляр этого типа включает в себя указатель на эту таблицу (в объекте используется дополнительная память для ссылки на VMT).
Организация связи объектов с VMT является одной из функций конструктора, поэтому конструктор всегда должен вызываться до вызова виртуальных методов.
Все вызовы виртуальных методов происходят через VMT.
Обращение к VMT через объект происходит с помощью скрытого параметра SELF, который указывает на объект, вызвавший виртуальный метод, и посылается методу при его вызове.
Виртуальные и динамические методы
Существует два подкласса виртуальных методов: виртуальные (VIRTUAL) и динамические (DYNAMIC) методы, для которых компилятор создает таблицы виртуальных и динамических методов соответственно.
-В таблице виртуальных методов (Virtual Method Table, VMT) содержаться адреса VIRTUAL-методов данного класса и всех его родителей. Данная таблица имеет большой размер, но обеспечивает более быстрый, чем у динамических методов, поиск.
-В таблице динамических методов (Dynamic Method Table, DMT) содержаться только ссылки на методы класса данного объекта. Использование таких таблиц позволяет сэкономить память, но замедляет обращение к этим методам, поскольку поиск методов может производиться не только в DMT текущего класса, но и в DMT его предков, до тех пор, пока не будет найдена нужная точка входа в подпрограмму.
- Принципы объектно-ориентированного программирования.
- Структура класса.
- Свойства.
- Статические и виртуальные методы.
- Перезагружаемые методы.
- Конструкторы и деструкторы.
- Интегрированная среда разработки Delphi.
- Визуальные средства разработки.
- Программирование с управлением по событиям.
- Абстрактный метод.
- Методы класса.
- Исключительные ситуации.
- Атрибуты доступа в Delphi.
- Обработка исключительных ситуаций.
- Библиотека визуальных компонентов в Delphi (vcl).
- Ссылки на классы.
- Указатели на методы.
- Фреймы и шаблоны компонентов.
- Delphi 2009: отличия от предыдущих версий.
- Классы и модули.
- Модули и программы.
- Информация о типе во время выполнения.
- Полиморфизм и виртуальные методы.