Утка набирает подмножество полиморфизма

17

От полиморфизма в Википедии

В информатике полиморфизм - это особенность языка программирования, которая позволяет обрабатывать значения различных типов данных с использованием единого интерфейса.

От утки печатать на Википедии

В компьютерном программировании с объектно-ориентированными языками программирования утилитная типизация - это стиль динамической типизации, в котором текущий набор методов и свойств объекта определяет допустимую семантику, а не его наследование от определенного класса или реализацию определенного интерфейса.

Моя интерпретация заключается в том, что на основе типизации утки методы / свойства объектов определяют действительную семантику. Это означает, что текущая форма объекта определяет интерфейс, который он поддерживает.

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

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

(Использование термина интерфейс подразумевается не как кодовая конструкция, а скорее как описательная документирующая конструкция)

  • Какова правильная связь между типизацией и полиморфизмом?
  • Если язык может использовать тип «утка», значит ли это, что он может полиморфизм?
Raynos
источник
1
Не уверен, что вы ищете в ответе. Вы определили оба точно, так что у вас есть столько же окончательного ответа, сколько есть. Решение о том, считается ли утка «полиморфизмом», является более или менее философским вопросом или, возможно, вопросом терминологии, если вы так думаете. Так что бы вы искали в ответе?
PSR
@psr Я в основном говорил: «Вот как я это интерпретирую. Я ошибаюсь? Я прав? Существуют ли академические люди, которые говорят это так или иначе. Есть ли какие-либо статьи на эту тему?» В основном в деталях, кроме «типизации утки - это реализация / подмножество полиморфизма», что еще можно сказать об отношениях?
Райнос
насколько я понимаю, гомография заставляет утку печатать что-то еще, кроме единого интерфейса =>, а не полиморфизм, или, по крайней мере, не в том смысле, как это определяет Википедия. Например, door.close()иtiger.close()
комнат
4
Типирование утки - случай специального полиморфизма . Ты слишком обдумываешь это.
Яннис

Ответы:

16

Я говорю, что полиморфизм - это общая черта, которая может быть реализована несколькими способами:

  • наследование на основе классов.
  • объекты на основе прототипа (с наследованием или без него)
  • утка печатать
  • соответствие интерфейса (как это делается интерфейсами Go и неявно в шаблонах C ++)

каждый из них позволяет программисту использовать один код с разными типами, поэтому все они воплощают концепцию полиморфизма.

Хавьер
источник
7

Я так думаю:

Как типирование утки, так и полиморфизм являются средствами косвенного обращения / абстракции. Полиморфизм - это концепция, основанная на типах и типизировании, тогда как типирование уток основано на контрактах.

При полиморфизме важно, что такое ВЕЩЬ, а не то, как оно ведет себя (его поведение может быть следствием того, чем оно является).

При наборе утки важно, как ведет себя ВЕЩЬ. Утиная типизация больше связана с концепцией объектов как акторов, которые обмениваются сообщениями, а не объектов, которые имеют определенные свойства.

Войцех Soczyński
источник
2
Это не правильно. Полиморфизм - это огромный зонт, покрывающий множество вещей. В частности, это касается утки. Таким образом, типирование утки является формой полиморфизма.
Томас Эдинг
Я не согласен. Традиционное наследование с поведенческими методами имеет те же черты. Это просто более типобезопасный будучи явно , как к какому поведению объект гарантирован на выставку (что не исключает другие типов поведения!)
marstato
6

Ответ ДА .

Утиная типизация является особым случаем динамической типизации , и даже если динамическая типизация сама по себе не может считаться полиморфизмом (поскольку это просто свойство языка выполнять проверку типов во время выполнения, а не во время компиляции), методы, которые обычно В основе динамической типизации лежат такие поздние связывания и динамическая диспетчеризация, которые характерны для полиморфизма .

Александр Галкин
источник
Проблема со статьей в Википедии и тем, как много людей используют этот термин в настоящее время, состоит в том, что она не определяет, что означала типизация утки, когда я впервые увидел ее (а именно, форму набора текста), а скорее способна просто вызывать методы и бросать Ошибка времени выполнения, когда они не определены. Это не печатание, а отсутствие печатания, как объясняет Эрик Липперт .
reinierpost
1

Утиная типизация не совсем подмножество полиморфизма, так как полиморфизм требует явного подхода, который теряется при утилитной типизации. Таким образом, утиная типизация имеет шанс «реализовать» «интерфейс» не потому, что он имеет смысловой смысл, а потому что у вас одинаковая подпись. Если бы типирование утки было подмножеством полиморфизма, то оно имело бы все свойства полиморфизма, включая явное объявление.

Утиная печать также не является реализацией полиморфизма, она является частью другой системы типов. Обычно вы ассоциируете утку с динамическим языком, который идет вперед и передает сообщение объекту, не зная, может ли объект с ним справиться - если это возможно, тогда он успешно прошел тест на печать утки. Обычно вы думаете о полиморфизме, который реализуется во время компиляции путем установки vtables (и itables, если интерфейсы отличаются от классов). Но есть много языков и множество способов реализовать эти функции.

В какой-то степени это философский вопрос. Можете ли вы думать о типизации утки как об интерфейсах, которые автоматически объявлены неявно? Я не могу придумать причину, по которой это неправильно , но я не думаю, что это, вероятно, самый продуктивный способ взглянуть на это. Я думаю, что типизация утки и интерфейсы - это часто встречающиеся особенности систем типов языка программирования, оба имеют довольно схожие способы поведения, и оба они важны для понимания программистами.

PSR
источник
6
«полиморфизм требует явности», где он так говорит? наследование на основе классов - это просто форма полиморфизма, а не единственная.
Хавьер
И продолжая комментарий @ Хавьера, как насчет специального полиморфизма ?
Яннис
@YannisRizos - проблема с ответом на любой вопрос, подобный этому, состоит в том, что существует так много языков и так много терминологии, что кто-то может придираться к вам независимо от того, что вы говорите. Я понимаю, почему в названии «ad hoc polymorphism» есть слово «polymorphism», но я бы сказал, что это нечто иное, чем то, что OP означает «polymorphism».
PSR
@Javier - Все методы, которые вы перечислили, требуют четкости, кроме утки.
PSR
@psr На самом деле мне все равно, что ОП означает «полиморфизм». Я не думаю, что кого-то это должно волновать, это научная концепция с очень простым определением, я не думаю, что мы должны отвечать, основываясь на наших собственных интерпретациях или на том, что мы можем считать интерпретацией OP. Особенно интерпретация ОП, так как он спрашивает, поэтому по умолчанию он не уверен в своей интерпретации. Я не согласен с тем, что это философский вопрос. Вопрос, как он был сформулирован, был научным с одним простым ответом: да, типирование утки - это форма специального полиморфизма, одна из разновидностей полиморфизма.
Яннис
1

Почти естественно говорить: «Да, если у foo есть утка, у foo есть полиморфизм». Но я не могу сказать , что это 100% уверен в том смысле , что , может быть , это можно придумать искусственные примеры такой системы , которая имеет утиную типизацию ( "может это шарлатаном && он может плавать по воде ==> это Утка "), хотя у нее нет полиморфизма (" фу, шарлатан! "Не получается), но в действительности это будет искусственно, и в реальном мире я бы сказал:" Да, если присутствует типирование утки, полиморфизм также должен присутствовать ".

Лично я вижу типизацию утки как «полиморфизм, сделанный правильно». Под этим я подразумеваю, что вещи, которые существуют в мире типизации уток, не должны иметь никаких явных типов, и их поведение (polymorphic = "тот же доступ, другой результат") является единственным, что имеет значение. В других реализациях полиморфизма он ограничен типами / интерфейсами / наследованием, поэтому он «реализован и ограничен полиморфизмом», а не «полиморфизм как таковой».

Херби
источник
0

Статически типизированные языки программирования позволяют проводить более раннюю проверку ошибок, лучше применять дисциплинированные стили программирования и генерировать более эффективный объектный код, чем языки, в которых все проверки согласованности типов выполняются во время выполнения.

(Б. Пирс и друзья)

Так что, как вы можете заметить, в этом отношении типизация утки - это динамическая типизация.

Существует некоторый метод для определения типа, который относится к полиморфингу, например, который делает код более гибким, но в этих случаях совсем другая проблема - это типичная утка.

В деталях есть напечатанное лямбда-исчисление и нетипизированное лямбда-исчисление, которые помогают определить свойство вычисления и вычисления.

Я также вижу, что такие вещи, как утка, могут помочь, если мы просто хотим получить результат быстро, но в других случаях я также чувствую, что динамическая природа делает его более приспосабливаемым к потребностям, поэтому я могу вычислять быстрее. Я думаю, это просто сказать, дорогой, что если я действительно знаю, что я хочу вычислить, лучше набрать текст, но почему я знаю, чего я хочу? Хехехе ...

Это мои пять центов, и я думаю, это может стать интересной темой для исследования.

Эдд
источник