Полиморфизм (информатика): различия между версиями

[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
→‎Полиморфизм подтипов: орфография (откат излишней макрозамены)
м →‎Классификация: орфография
Строка 59:
Двойственность содержания термина {{nobr|«''ad hoc полиморфизм''»}} долгие годы была заслуженной{{sfn|Wadler - How to make ad-hoc polymorphism less ad hoc|с=1-2}}. Стрэчи выбрал этот термин, руководствуясь первым значением — в работе он подчеркивает, что при {{nobr|ad hoc}} полиморфизме нет единого систематичного способа вывести тип результата из типа аргументов, и хотя возможно построение определённого набора правил для сужения спектра его поиска, но эти правила по своей природе являются спонтанными как по содержанию, так и по контексту применения{{sfn|Strachey - Fundamental Concepts|1967}}.
 
Действительно, [[ad hoc полиморфизм]] не является ''истинным'' полиморфизмом{{sfn|Cardelli - On Understanding Types|loc=1.3. Kinds of Polymorphism|с=6}}. [[Перегрузка функций]] даёт не «'''''значение''', имеющее множество типов''», а «'''''символ''', имеющий множество типов''», но значения, [[Идентификатор|идентифицируемые]] этим символом, имеют ''разные'' (потенциально {{nobr|не совместимые}}несовместимые) типы. Аналогично, [[приведение типов]] не является истинным полиморфизмом: кажется, будто оператор принимает значения множества типов, но значения должны быть ''преобразованы'' к некоторому представлению до того, как он сможет их использовать, так что на самом деле оператор работает лишь над одним типом (то есть имеет один тип). Более того, [[тип возвращаемого значения]] здесь не зависит от [[Параметр (программирование)|типа входного параметра]], как в случае параметрического полиморфизма.
 
Тем не менее, определение специальных реализаций функций для разных типов в некоторых случаях является ''необходимостью'', а не случайностью. Классическими примерами служат реализация арифметических операций (физически различная для [[Целый тип|целых]] и [[Число с плавающей запятой|чисел с плавающей запятой]]) и {{iw|Интуиционистская теория типов#Равенство типов|равенства типов|en|Intuitionistic type theory#Equality type}}, которые на протяжении десятилетий не имели общепринятой универсальной формализации. Решением стали [[Класс типов|классы типов]]{{переход|#Классы типов|text}}, представляющие собой механизм явного дискретного перечисления допустимых значений [[Переменная типа|переменных типа]] для статической диспетчеризации в слое типов. Это сводит воедино две разновидности полиморфизма, разделённые Стречи, и «''делает {{nobr|ad hoc полиморфизм}} менее {{nobr|ad hoc}}''»{{sfn|Wadler - How to make ad-hoc polymorphism less ad hoc|с=1-2}} ([[игра слов|игра]] на двойственности смысла).
 
В отличие от [[перегрузка функций|перегрузки]] и [[приведение типов|приведения типов]], полиморфизм {{iw|Выделение подтипов данных|подтипов|en|Subtyping}}{{переход|#Полиморфизм подтипов|text}} является ''истинным'' полиморфизмом: объектами подтипа можно манипулировать единообразно, как если бы они они принадлежали к своим супертипам (но сказанное не верноневерно для языков, реализующих «''полиморфизм при наследовании''» посредством [[приведение типов|приведения типов]], как в случае {{nobr|[[С++]]}}). Наиболее ''чистым'' является [[параметрический полиморфизм]]{{переход|#параметрический полиморфизм|text}}: один и тот же объект или функция может единообразно использоваться в разных контекстах типизации без изменений, приведений типов или любых других проверок времени исполнения или преобразований. Однако, для этого требуется некое единообразное представление данных (например, посредством [[указатель (программирование)|указателей]]).{{sfn|Cardelli - On Understanding Types|с=6}}
 
== Основные разновидности полиморфизма ==