Полиморфизм — реализация, параметрический полиморфизм


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

Ключевой момент в виртуальных методах — указатели на код, хранящийся в VMT, а ключевой момент в полиморфизме — использование данных экземпляра класса для получения указателя на нужную таблицу VMT во время выполнения программы. Действительно, у компилятора нет возможности определить класс объекта, фактически передаваемого для обработки в процессе выполнения программы. Поэтому нужен механизм, позволяющий определить это непосредственно во время выполнения, — это называется поздним связыванием (late binding). Этот механизм должен быть связан с передаваемым объектом. В качестве такого механизма и служат VMT и DMT.

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

Для реализации полиморфизма подходят две схемы взаимоотношения класса-предшественника и производного класса:
• есть класс-предшественник, в котором объявлен один или более виртуальных (динамиеских) методов. Имеется производный класс, в котором произведено замещение одного или более виртуальных (динамических) методов класса-предшественника;
• есть класс-предшественник, в котором объявлен один или более абстрактных метода. Имеется один или более производных класса, в которых переопределены абстрактные методы класса-предшественника.

Экземпляр производного класса можно присвоить переменной класса-предшественника, но обратное невыполнимо, поскольку объект производного класса больше объекта класса-предшественника, поскольку включает новые поля и/или методы. Более того, если бы это было возможно, то экземпляр класса-предшественника мог бы обращаться к полям и методам, которых у него нет.

Таким образом, полиморфизм возможен тогда, когда имеется:
• класс предшественник, определяющий один или более виртуальных методов;
• один или более производных классов, которые могут замещать эти виртуальные методы;
• переменная представителя класса, объявленная, как переменная типа класса-предшественника, но реально содержащая представителя одного из производных классов.

Полиморфное выполнение: В классах-потомках замещены (Override) методы предка. Метод вызывается в зависимости от объекта, а не от класса.

Полиморфное присвоение
Если определить свойство

Property XYZ:integer read:GetXYZ write SetXYZ;

И метод SetXYZ(xy:integer);Virtual; заместить в классе-потомке. Создать переменную типа родительский класс (ROD) и присвоить этой переменной экземпляр дочернего класса ROD:=do4.create. То do4.XYZ:=1; будет вызывать новый метод SetXYZ;

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

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


Комментарии запрещены.




Статистика