О полиморфизме
От: Gaperton http://gaperton.livejournal.com
Дата: 26.02.08 20:01
Оценка: 541 (50) +5 :)
#Имя: FAQ.philosophy.polymorphism
Здравствуйте, rrsstio, Вы писали:

R>Подумалось... насколько верен термин "Полиморфизм" в отношении ООП.


R>Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования. (с) Вики


R>А смысл самого слова с греческого — нечто, что обладает многими формами.


R>Но в ООП смысл ИМХО другой — есть ОДНА форма (например интерфейс), но РАЗНЫЕ содержания (реализации)!


R>Или я неправ?


Хотите волшебным образом наведем порядок в голове, и быстро?

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

Полиморфная функция бывает двух видов.
Ad-hoc полиморфизм — функция ведет себя по разному для аргументов разных типов. Функция "нарисовать" — рисует по разному разные геометрические фигуры.
Параметрический полиморфизм — функция ведет себя одинаково для аргументов разных типов. Пример — функция "положить элемент в контейнер".

Полиморфизм бывает естественным и искусственным.
Естественный — когда информация о типе проходит автоматически, вместе со значением. И язык поддерживает Ad-hoc полиморфизм явным образом.
Искусственный полиморфизм — когда информация о типе протаскивается отдельными параметрами. Например, printf — полиморфная функция. Информация о типе аргументов идет в форматной строке — первым аргументом.

Иногда выделяют статический и динамический полиморфизм — когда тип разрешается во время компиляции, или во время выполнения.

О полиморфизме все. Обратите внимание — слова "класс" и ничего относящегося к ООП здесь нет. Теперь об ООП.

Когда вы вызываете метод класса — это вызов функции, "нулевым" (неявным) аргументом которой идет объект (на этот аргумент ссылаются как this).

Рассмотрим для примера естественный полиморфизм языка С++.

Времени компиляции:
1) Перегрузка функций. Тип аргументов является частью сигнатуры. Имеем Ad hoc полиморфизм.
2) Шаблонные функции. Параметрический полиморфизм. В сочетании со специализацией — имеем также и ad hoc — опять. Довольно гибко.

Времени выполнения:
1) Указатель на базовый класс — полиморфная переменная. Любая функция, принимающая такое аргументом — будет обладать параметрическим полиморфизмом. Обратите внимание — наследование в С++ и других строготипизированных ОО языках является ослаблением системы типов, и средством обеспечения параметрического полиморфизма в рантайме. Это еще одна функция наследования, выходящая за рамки классического ОО по определению Алана Кея, которое реализовано в Смоллтоке. Потому, что Смоллток динамически типизирован, и там любая переменная — полиморфна. Соответственно — там вообще любая функция обладает параметрическим полиморфизмом по всем своим аргументам. И там, как следствие, не нужны шаблоны, как в С++, и generics, как в C#. Обратите внимание — мы сейчас касаемся фундаментальных свойств языков и языкостроения вообще.
2) Виртуальная функция — ad-hoc полиморфна по единственному неявному аргументу. Единственному, и неявному. Это слабое свойство ОО модели вообще, вынуждающее городить страшные паттерны, такие как Visitor и double dispatch, когда требуется ad-hoc полиморфизм не по одному аргументу, а по нескольким. Решение этой проблемы — мультиметоды, которые есть в некоторых ОО системах, и были предложены к включению в стандарт С++.

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