ПОЛИМОРФИЗМ

 

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

Для реализации таких иерархий в языке программирования должен быть предусмотрен полиморфизм, обеспечивающий возможность задания различных реализаций некоторого единого по названию метода для классов различных уровней иерархии. В ООП такой полиморфизм называется простым, а методы, имеющие одинаковое название, − статическими полиморфными.

Совокупность полиморфных методов с одним именем для иерархии классов образует единый полиморфный метод иерархии, в котором реализация полиморфного метода для конкретного класса представляет отдельный аспект.

Заметим, что термин «полиморфизм» в программировании, в соответствии со своим изначальным смыслом («многообразие»), используется для обозначения встроенного механизма определения соответствия кода функции типу параметров. Такой механизм реализуется не только в средствах ООП.

Различают несколько терминов, связанных с конкретными механизмами реализации полиморфизма для различных случаев.

Чистый полиморфизм − используется для обозначения того, что один код функции может по-разному интерпретироваться в зависимости от типа аргументов; используется в языках высокого уровня абстракции, например в языке LISP или SMALLTALK.

Перегрузка (полиморфные имена функций) − используется, когда определяется несколько функций с одним именем − одно и то же имя функции может многократно использоваться в разных местах программы; выбор нужной функции может определяться типами аргументов, областью видимости (внутри модуля, файла, класса и т.д.); если выбор определяется типом аргументов, то перегрузка называется параметрической; например язык C++ позволяет разработчику выполнять параметрическую перегрузку функций вне классов.

Переопределение (простой полиморфизм) − используется в ООП при наличии различных определений методов в иерархии классов, конкретный метод определяется типом объекта при компиляции программы {раннее связывание), методы называются статическими полиморфными.

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

Обобщенные функции или шаблоны − используются в ООП при реализации в языке параметризованных классов (например, в C++), параметрами такого класса являются типы аргументов методов класса (рассмотрены далее).

Рассмотрим простой полиморфизм на примере − класс Окно_с_текстом.Пусть необходимо разработать на базе класса Окно класс Окно_с_текстом. Для этого к полям класса Окно необходимо добавить специальные поля для определения координат первой буквы текста − Xt, Yt и поле, содержащее сам текст − Text. Кроме этого, понадобится специальный метод, который будет обрабатывать сообщение «Нарисовать». Однако у нас уже существует родительский метод Изобразить, который обрабатывает это сообщение. Следовательно, необходимо заменить родительский метод методом потомка.

Механизм полиморфизма позволяет для класса-потомка Окно_с_текстом предусмотреть собственный метод Изобразить (см. рис. 18). Метод Инициализировать также должен быть переопределен, так как он должен инициализировать дополнительные поля класса.

Класс Окно_с_текстом - родитель: класс Окно:

поля Xt, Yt, Text

метод Инициализировать (aXl,aYl,aX2,aY2,aColor,

aXt, aYt, aText)

метод Изобразить