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

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

Кажется, ничего не пропустил насчет полиморфизма в С++. Вы можете теперь разложить по полочкам любой известный вам язык самостоятельно.
rrsstio
rrsstio
27.02.2008 10:25
Здравствуйте, Gaperton, Вы писали:

G>Здравствуйте, rrsstio, Вы писали:


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


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


Респект и уважуха
Если бы вы еще использовали какое-нибудь русское слово вместо ad hoc, было бы вообще зашибись
konsoletyper
konsoletyper
27.02.2008 01:32
Здравствуйте, rrsstio, Вы писали:

R>Если бы вы еще использовали какое-нибудь русское слово вместо ad hoc, было бы вообще зашибись


Специальный, вестимо. Хотя, ad hoc, как, например, list comprehension, лучше не переводить
... << RSDN@Home 1.2.0 alpha rev. 672>>
rrsstio
rrsstio
01.03.2008 11:41
Здравствуйте, konsoletyper, Вы писали:

K>Здравствуйте, rrsstio, Вы писали:


R>>Если бы вы еще использовали какое-нибудь русское слово вместо ad hoc, было бы вообще зашибись


K>Специальный, вестимо. Хотя, ad hoc, как, например, list comprehension, лучше не переводить


Я знаю как переводиться ad hoc только понятней от этого не становаиться.
Что вам может сказать выражение "специальный полиморфизм"? Только то, что он отличается от какого-то общего.
Лучше уж совем тогда ничего не переводить, иначе использование "полупереводов" облегчает дело только писателю,
но никак не способствует пониманию читателю.
deniok
deniok
01.03.2008 12:06
Здравствуйте, rrsstio, Вы писали:

R>Здравствуйте, konsoletyper, Вы писали:


K>>Здравствуйте, rrsstio, Вы писали:


R>>>Если бы вы еще использовали какое-нибудь русское слово вместо ad hoc, было бы вообще зашибись


K>>Специальный, вестимо. Хотя, ad hoc, как, например, list comprehension, лучше не переводить


R>Я знаю как переводиться ad hoc только понятней от этого не становаиться.

R>Что вам может сказать выражение "специальный полиморфизм"? Только то, что он отличается от какого-то общего.
R>Лучше уж совем тогда ничего не переводить, иначе использование "полупереводов" облегчает дело только писателю,
R>но никак не способствует пониманию читателю.

Не переводить — это сильно! А вообще — это основная проблема перевода устоявшегося в англоязычной литературе термина на русский (где еще нет устоявшегося аналога). Тут любой перевод будет "полуперевод" пока сообщество не примет какой-то из них как общепринятый. По тем или иным причинам. По-моему, "специальный/общий" — вполне нормальный перевод, но решать-то всем вместе, причём такие решения принимаются не сознательно, а по ходу профессионального общения.
Константин
Константин
04.03.2008 11:07
Здравствуйте, deniok, Вы писали:

R>>>>Если бы вы еще использовали какое-нибудь русское слово вместо ad hoc, было бы вообще зашибись

...
D>Не переводить — это сильно! А вообще — это основная проблема перевода устоявшегося в англоязычной литературе термина на русский (где еще нет устоявшегося аналога). Тут любой перевод будет "полуперевод" пока сообщество не примет какой-то из них как общепринятый. По тем или иным причинам. По-моему, "специальный/общий" — вполне нормальный перевод, но решать-то всем вместе, причём такие решения принимаются не сознательно, а по ходу профессионального общения.

Предлагаю перевести как "адхок"
Delight
Delight
27.02.2008 12:22
Хорошо написано. Можно ещё разве что упомянуть деление на predicative/impredicative, насколько я помню.
... << RSDN@Home 1.2.0 alpha rev. 726>>
Gaperton
Gaperton
27.02.2008 12:51
Здравствуйте, Delight, Вы писали:

D>Хорошо написано. Можно ещё разве что упомянуть деление на predicative/impredicative, насколько я помню.


Добавляйте, поправляйте и дополняйте . Я про predicative/impredicative если даже и слышал когда — то надежно забыл.
Delight
Delight
27.02.2008 01:25
Взял из Википедии:

Type systems with parametric polymorphism can be classified into predicative and impredicative systems. The key difference is in how parametric values may be instantiated. For example, consider the append function described above, which has type [a] ? [a] > [a]; in order to apply this function to a pair of lists, a type must be substituted for the variable a in the type of the function such that the type of the arguments matches up with the resulting function type. In an impredicative system, the type being substituted may be any type whatsoever, including a type that is itself polymorphic; thus append can be applied to pairs of lists with elements of any type -- even to lists of polymorphic functions such as append itself. In a predicative system, type variables may not be instantiated with polymorphic types. This restriction makes the distinction between polymorphic and non-polymorphic types very important; thus in predicative systems polymorphic types are sometimes referred to as type schemas to distinguish them from ordinary (monomorphic) types, which are sometimes called monotypes.

Polymorphism in the language ML and its close relatives is predicative. This is because predicativity, together with other restrictions, makes the type system simple enough that type inference is possible. In languages where explicit type annotations are necessary when applying a polymorphic function, the predicativity restriction is less important; thus these languages are generally impredicative. Haskell manages to achieve type inference without predicativity but with a few complications.

In type theory, the most frequently studied impredicative typed lambda-calculi are based on those of the lambda cube, especially System F. Predicative type theories include Martin-Lof Type Theory and NuPRL.
... << RSDN@Home 1.2.0 alpha rev. 726>>
Andrei N.Sobchuck
Andrei N.Sobchuck
27.02.2008 01:50
Здравствуйте, Delight, Вы писали:

D>Взял из Википедии:


А перевести?
http://www.smalltalk.ru << RSDN@Home 1.1.4 stable SR1 rev. 568>>