В информатике полиморфизм - это особенность языка программирования, которая позволяет обрабатывать значения различных типов данных с использованием единого интерфейса.
В компьютерном программировании с объектно-ориентированными языками программирования утилитная типизация - это стиль динамической типизации, в котором текущий набор методов и свойств объекта определяет допустимую семантику, а не его наследование от определенного класса или реализацию определенного интерфейса.
Моя интерпретация заключается в том, что на основе типизации утки методы / свойства объектов определяют действительную семантику. Это означает, что текущая форма объекта определяет интерфейс, который он поддерживает.
Из полиморфизма можно сказать, что функция является полиморфной, если она принимает несколько различных типов данных, если они поддерживают интерфейс.
Поэтому, если функция может использовать тип «утка», она может принимать несколько различных типов данных и работать с ними, если эти типы данных имеют правильные методы / свойства и, таким образом, поддерживают интерфейс.
(Использование термина интерфейс подразумевается не как кодовая конструкция, а скорее как описательная документирующая конструкция)
- Какова правильная связь между типизацией и полиморфизмом?
- Если язык может использовать тип «утка», значит ли это, что он может полиморфизм?
door.close()
иtiger.close()
Ответы:
Я говорю, что полиморфизм - это общая черта, которая может быть реализована несколькими способами:
каждый из них позволяет программисту использовать один код с разными типами, поэтому все они воплощают концепцию полиморфизма.
источник
Я так думаю:
Как типирование утки, так и полиморфизм являются средствами косвенного обращения / абстракции. Полиморфизм - это концепция, основанная на типах и типизировании, тогда как типирование уток основано на контрактах.
При полиморфизме важно, что такое ВЕЩЬ, а не то, как оно ведет себя (его поведение может быть следствием того, чем оно является).
При наборе утки важно, как ведет себя ВЕЩЬ. Утиная типизация больше связана с концепцией объектов как акторов, которые обмениваются сообщениями, а не объектов, которые имеют определенные свойства.
источник
Ответ ДА .
Утиная типизация является особым случаем динамической типизации , и даже если динамическая типизация сама по себе не может считаться полиморфизмом (поскольку это просто свойство языка выполнять проверку типов во время выполнения, а не во время компиляции), методы, которые обычно В основе динамической типизации лежат такие поздние связывания и динамическая диспетчеризация, которые характерны для полиморфизма .
источник
Утиная типизация не совсем подмножество полиморфизма, так как полиморфизм требует явного подхода, который теряется при утилитной типизации. Таким образом, утиная типизация имеет шанс «реализовать» «интерфейс» не потому, что он имеет смысловой смысл, а потому что у вас одинаковая подпись. Если бы типирование утки было подмножеством полиморфизма, то оно имело бы все свойства полиморфизма, включая явное объявление.
Утиная печать также не является реализацией полиморфизма, она является частью другой системы типов. Обычно вы ассоциируете утку с динамическим языком, который идет вперед и передает сообщение объекту, не зная, может ли объект с ним справиться - если это возможно, тогда он успешно прошел тест на печать утки. Обычно вы думаете о полиморфизме, который реализуется во время компиляции путем установки vtables (и itables, если интерфейсы отличаются от классов). Но есть много языков и множество способов реализовать эти функции.
В какой-то степени это философский вопрос. Можете ли вы думать о типизации утки как об интерфейсах, которые автоматически объявлены неявно? Я не могу придумать причину, по которой это неправильно , но я не думаю, что это, вероятно, самый продуктивный способ взглянуть на это. Я думаю, что типизация утки и интерфейсы - это часто встречающиеся особенности систем типов языка программирования, оба имеют довольно схожие способы поведения, и оба они важны для понимания программистами.
источник
Почти естественно говорить: «Да, если у foo есть утка, у foo есть полиморфизм». Но я не могу сказать , что это 100% уверен в том смысле , что , может быть , это можно придумать искусственные примеры такой системы , которая имеет утиную типизацию ( "может это шарлатаном && он может плавать по воде ==> это Утка "), хотя у нее нет полиморфизма (" фу, шарлатан! "Не получается), но в действительности это будет искусственно, и в реальном мире я бы сказал:" Да, если присутствует типирование утки, полиморфизм также должен присутствовать ".
Лично я вижу типизацию утки как «полиморфизм, сделанный правильно». Под этим я подразумеваю, что вещи, которые существуют в мире типизации уток, не должны иметь никаких явных типов, и их поведение (polymorphic = "тот же доступ, другой результат") является единственным, что имеет значение. В других реализациях полиморфизма он ограничен типами / интерфейсами / наследованием, поэтому он «реализован и ограничен полиморфизмом», а не «полиморфизм как таковой».
источник
(Б. Пирс и друзья)
Так что, как вы можете заметить, в этом отношении типизация утки - это динамическая типизация.
Существует некоторый метод для определения типа, который относится к полиморфингу, например, который делает код более гибким, но в этих случаях совсем другая проблема - это типичная утка.
В деталях есть напечатанное лямбда-исчисление и нетипизированное лямбда-исчисление, которые помогают определить свойство вычисления и вычисления.
Я также вижу, что такие вещи, как утка, могут помочь, если мы просто хотим получить результат быстро, но в других случаях я также чувствую, что динамическая природа делает его более приспосабливаемым к потребностям, поэтому я могу вычислять быстрее. Я думаю, это просто сказать, дорогой, что если я действительно знаю, что я хочу вычислить, лучше набрать текст, но почему я знаю, чего я хочу? Хехехе ...
Это мои пять центов, и я думаю, это может стать интересной темой для исследования.
источник