- •1. Новые концепции ооп в языке Oblect Pascal
- •2. Объектно-ориентированный подход в программировании
- •Основные понятия
- •3. Понятие класса и объекта
- •4. Поля, методы и свойства объекта
- •5. Ключевое слово Self, примеры использования
- •6. Перегруженные методы
- •7. Создание и удаление объектов
- •8. Инкапсуляция
- •9. Инкапсуляция и модули
- •10. Директивы видимости
- •11. Инкапсуляция при помощи свойств
- •12. Свойства-массивы
- •13. Индексированные свойства
- •14. Свойства и иерархия классов
- •15. Конструкторы, перегрузка конструкторов, 16. Деструкторы
- •17. Ссылочная модель объектов Delphi
- •18. Наследование
- •19. Совместимость типов
- •20. Полиморфизм и позднее связывание
- •21. Виртуальные, динамические методы
- •22. Абстрактные методы
- •23. Бе6зопасное преобразование типов
- •24. Ссылки на класс
- •25. Создание компонентов при помощи ссылок на класс
- •26. Интерфейсы
- •27. Технические приемы, связанные с использованием интерфейсов (делегирование, использование директивы implements)
- •28. Исключительные ситуации
- •29. Порядок выполнения программы и блок finally
- •30. Классы исключений
- •31. Исключения и отладка приложений
- •32. Класс tObject, использование методов класса Tobject
- •33. Понятие события
- •34. Обработчики событий. Делегирование в Delphi
- •35. События стандартных визуальных компонент и их использование
21. Виртуальные, динамические методы
^ Синтаксис один, семантически это одно и то же, результат тот же самый. Различие состоит во внутреннем механизме, используемом компонентами для реализации позднего связывания. Обращение к любому виртуальному методу происходит через таблицу VMT, которая представляет собой массив адресов методов. Каждый класс обладает своей собственной таблицей, где хранятся адреса виртуальных методов этого класса. Чтобы передать управление некоторому виртуальному методу, компилятор генерирует код, выполняет переход по адресу, указанному в ячейке, соответствующей указанному методу. Т.е. VMT обеспечивает быстрое выполнение вызовов. Недостатком является то, что требуется отдельной ячейки для каждого виртуального метода каждого дочернего класса, даже если этот метод не был перекрыт ни в одном из дочерних классов. Для больших иерархий требуются большие объемы памяти. Для осуществления вызова динамического метода, используется специальный уникальный номер, с помощью которого метод идентифицируется. Поиск адреса соответствующей функции или процедуры, как правило, осуществляется медленнее, чем по таблице. Применение динамического метода заключается в том, что информация о методах копируется в дочерний класс только в том случае, если метод был перекрыт в этом классе. Для глубоких иерархий использование такого метода может привести к существенной экономии памяти. Пусть определены три класса, один из которых является базовым для двух других: {Tуре TPerson = class fname: string; // имя constructor Create(name:string); function info: string; virtual; end; TStud = class(TPerson) fgr:integer; // номер учебной труппы constructor Create(name:string;gr:integer); function info: string; override; end; TPerson TProf = class(TPerson) fdep:string; // название кафедры constructor Create(name:string;dep:string); function info: string; override; end;}
///
Разница между виртуальными и динамическими методами заключается в особенности поиска адреса. Когда компилятор встречает обращение к виртуальному методу, он подставляет вместо прямого вызова по конкретному адресу код,который обращается к VMT и извлекает оттуда нужный адрес. Такая таблица есть для каждого класса (объектного типа). В ней хранятся адреса всех виртуальных методов класса, независимо от того, унаследованы ли они от предка или перекрыты в данном классе. Отсюда и достоинства и недостатки виртуальных методов: они вызываются сравнительно быстро, однако для хранения указателей наних в таблице VMT требуется большое количество памяти.
Динамические методы вызываются медленнее, но позволяют более экономно расходовать память. Каждому динамическому методу системой присваивается уникальный индекс. В таблице динамических методов класса хранятся индексы и адреса только тех динамических методов, которые описаны в данном классе. При вызове динамического метода происходит поиск в этой таблице; в случае неудачи просматриваются таблицы DMT всех классов-предков в порядке иерархии и, наконец, TObject, где имеется стандартный обработчик вызова динамических методов. Экономия памяти налицо. Т.о., различие виртуальных и динамических методов состоит только в способе хранения их адресов. Адрес виртуального метода дальнего предка можно быстро взять из таблицы VMT данного класса, а для поиска адреса динамического метода дальнего предка придется по очереди
перебирать всю иерархическую цепочку данного класса, что гораздо медленнее, но экономит память. Директива override указывает что перекрывается динамический или виртуальный метод класса-предка. Без этой директивы перекрытие перекрывается динамических или виртуальных методов невозможно.
