Шаг 6 - Полиморфизм

Слово полиморфизм имеет греческое происхождение и переводится как "имеющий много форм".

Общее определение:

Полиморфизм - это свойство, которое позволяет одно и тоже имя использовать для решения нескольких технически разных задач.

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

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

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

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

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

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

К примеру, у нас есть класс "автомобиль", в котором описано как должен передвигаться автомобиль, как он поворачивает, как подает сигнал и т.д. Там же описан метод "переключение передачи". Допустим, что в этом методе класса "автомобиль" мы описали автоматическую коробку передач. А теперь нам необходимо описать класс "спортивный автомобиль", у которого механическое(ручное) переключение скоростей. Конечно, можно было бы описать заново все методы для класса "спортивный автомобиль". Но зачем, если у нас уже практически все описано и отлажено ?! Для этого и существует механизм наследования. Мы указываем, что класс "спортивный автомобиль" наследован из класса "автомобиль", а следовательно он обладает всеми свойствами и методами, описанными для класса-родителя. Единственное, что нам надо сделать - это переписать метод "переключение передач" для механической коробки передач. В результате, при вызове метода "переключение передач" будет выполняться метод не родительского класса, а самого класса "спортивный автомобиль".

Механизм работы ООП в таких случаях можно описать примерно так: при вызове того или иного метода класса сначала ищется метод у самого класса. Если метод найден, то он выполняется и поиск этого метода на этом завершается. Если же метод не найден, то обращаемся к родительскому классу и ищем вызванный метод у него. Если найден - поступаем как при нахождении метода в самом классе. А если нет - продолжаем дальнейший поиск вверх по иерархическому дереву. Вплоть до корня(верхнего класса) иерархии.

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


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Valeri Khromov - 5.02.2000