Как и все объектно-ориентированные языки, Delphi (Object Pascal) поддерживает концепцию полиморфизма. Полиморфизм - это греческое слово, буквально означающее "много форм". В применении к программированию это слово означает идею, что вызов концептуальной операции отделён от её реальной реализации. Фактически, в run-time эта реализация может существенно меняться, в зависимости от типа объекта, выполняющего операцию.
Одним из движущих факторов для ООП был графический пользовательский интерфейс (GUI). Архетипический пример полиморфизма из школьного учебника рабски следует шаблону по использованию абстрактного класса
TShape
как базового класса для потомков TRectangle
и TEllipse
, которые замещают виртуальный метод Draw
. Основная программа рисования перебирает список экземпляров TShape
, вызывая виртуальный метод Draw
- и каждый вызов будет обрабатываться потомком, рисуя прямоугольник или эллипс (или любую другую фигуру).В своей самой базовой концепции полиморфизм заключается в динамическом изменении целевого адреса инструкции
CALL
во время выполнения (run-time). С этой точки зрения есть большое количество механизмов, которые могут предоставить полиморфизм.На уровне языка Delphi:
Использованием грязных хаков:
- замещение (overwrite) указателя виртуального метода
- замещение указателя VMT
- замещение слота сообщений/динамического слота
- замещение адреса в инструкции CALL
- замещение инструкций вызываемой функции (сплайсинг)
- замещение слотов импорта DLL
Я попробую покрыть некоторые из этих способов в будущих постах, так что не переключайте канал!
Читать далее: Полиморфизм на практике - "как".
Все учебные статьи про полиморфизм за редким исключением НЕ раскрывают, зачем полиморфизм нужен.
ОтветитьУдалитьДумаю, любую статью нужно начинать с тезиса: "зачем нужен полиморфизм" или "зачем полиморфизм введен в языки программирования", иначе "утиные" заморочки вообще покажутся бредом....
Не прошло и десяти лет.
УдалитьНа эту тему ты сам и писал.
ОтветитьУдалить