ПОЛИМОРФИЗМ.

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

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

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

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

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

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

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

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

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

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

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

 

КЛАСС.

Класс (class) - это группа данных и методов(функций) для работы с этими данными. Это шаблон. Объекты с одинаковыми свойствами, то есть с одинаковыми наборами переменных состояния и методов, образуют класс.

Класс - это механизм для создания новых типов.

Мы уже говорили о классах и его отличиях от объекта, когда рассматривали понятие объекта.

Приведу примерную структуру класса. Она не привязанная к какому-либо языку ООП.

Class имя_класса [ от кого унаследован]

{

private:

public:

protected:

}

Private(частный) раздел описания класса обычно находится вначале описания класса и содержит данные, доступ к которым закрыт из внешнего мира. Это и есть та самая "строго охраняемая" зона класса, доступ к которой можно получить только из методов самого класса. Она скрыта от внешнего мира глухой непробиваемой стеной и доступ к данным раздела private обеспечивается только с помощью, специально описанных в других разделах, методов. Скрытые в этом разделе данные также не доступны для всех производных классов.

Protected(защищенный) - раздел описания класса содержит данные и методы, доступ к которым закрыт из внешней среды, но они напрямую доступны производным классам.

Таким образом, раздел protected используется для описания данных и методов, которые будут доступны только из производных классов. А в производных классах эти данные и методы воспринимаются, как если бы они были описаны в самом производном классе.

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