О полиморфизме

Mar 06, 2008 00:34

http://rsdn.ru/Forum/message/2853873.1.aspx
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 полиморфизм не по одному аргументу, а по нескольким. Решение этой проблемы - мультиметоды, которые есть в некоторых ОО системах, и были предложены к включению в стандарт С++.

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

языки программирования, полиморфизм, computer science, С++

Previous post Next post
Up