Здравствуйте, 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 полиморфизм не по одному аргументу, а по нескольким. Решение этой проблемы — мультиметоды, которые есть в некоторых ОО системах, и были предложены к включению в стандарт С++.
Кажется, ничего не пропустил насчет полиморфизма в С++. Вы можете теперь разложить по полочкам любой известный вам язык самостоятельно.