Качка набирає підмножину поліморфізму


17

З поліморфізму на Вікіпедії

В інформатиці поліморфізм - це мова мови програмування, яка дозволяє обробляти значення різних типів даних за допомогою єдиного інтерфейсу.

Від набору качок у Вікіпедії

У комп’ютерному програмуванні з об'єктно-орієнтованими мовами програмування типи качок - це стиль динамічного введення тексту, в якому поточний набір методів і властивостей об'єкта визначає дійсну семантику, а не її успадкування від певного класу чи реалізацію певного інтерфейсу.

Моє тлумачення полягає в тому, що на основі типізації качок методи / властивості об'єктів визначають дійсну семантику. Це означає, що поточна форма об'єктів визначає інтерфейс, який він підтримує.

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

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

(Використання терміна інтерфейс мається на увазі не як конструкція коду, а скоріше як описова, документальна конструкція)

  • Який правильний взаємозв'язок між качками та поліморфізмом?
  • Якщо мова може качки тип, це означає, що це може зробити поліморфізм?

1
Не впевнений, що шукаєте у відповіді. Ви обидва визначилися точно, тому у вас є стільки остаточної відповіді, скільки є. Вирішити, чи введення качки «вважається» поліморфізмом - це більш-менш філософське питання, чи, можливо, термінологічне запитання, якщо ви це маєте на увазі. То що б ви шукали у відповіді?
psr

@psr Я в основному говорив: "ось як я його трактую. Чи помиляюся? Я прав? Чи є авторитетні академічні люди, які говорять це так чи інакше. Чи є статті на цю тему?" В основному детально інше, ніж "типи качок - це реалізація / підмножина поліморфізму", що ще можна сказати про відносини?
Райнос

наскільки я розумію, гомографія змушує качка вводити що-небудь інше, однак єдиний інтерфейс => не поліморфізм, або принаймні не в сенсі того, як це визначає Вікіпедія. Напр. door.close()Іtiger.close()
гнат

4
Введення качок є випадком спеціального поліморфізму . Ви це надмірно думаєте.
янніс

Відповіді:


16

Я кажу, що поліморфізм - це загальна риса, яку можна реалізувати декількома способами:

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

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


7

Я думаю що:

І типізація качок, і поліморфізм є засобом опосередкованості / абстракції. Поліморфізм - це концепція, заснована на типах і типізації, тоді як типи качок засновані на контрактах.

При поліморфізмі важливо, що таке ТОЩО, а не те, як воно поводиться (його поведінка може бути наслідком того, що воно є).

При наборі качок важливо, як веде себе ЧАС. Введення качок більше пов'язане з поняттям об'єктів як дійових осіб, які обмінюються повідомленнями, а не об'єктами, які мають певні властивості.


2
Це неправильно. Поліморфізм - це величезна парасолька, яка охоплює багато речей. Зокрема, він охоплює типи качок. Таким чином, типи качок є формою поліморфізму.
Томас Едінг

Я не погоджуюсь. Традиційне успадкування методами поведінки має однакові риси. Це просто більш безпечно для типів, якщо чітко вказати, яку поведінку об’єкт гарантовано демонструє (що не виключає інших видів поведінки!)
marstato

6

Відповідь ТАК .

Введення качок - це особливий випадок динамічного набору тексту , і навіть якщо динамічне введення як таке не може бути безпосередньо розглянуте як поліморфізм (оскільки це властивість мови здійснювати перевірку типу під час виконання, а не під час компіляції), методи, які зазвичай лежать в основі динамічного типізації, такі пізні зв'язування та динамічні розсилки характерні для поліморфізму .


Проблема статті Вікіпедії та того, скільки людей сьогодні використовують цей термін, полягає в тому, що вона не визначає, що означало набирання качки, коли я вперше побачила це (а саме форма набору тексту), а, скоріше, спроможність просто викликати методи та кинути Помилка виконання, коли вони не визначені. Це не введення тексту, а скоріше відсутність набору тексту, як пояснює Ерік Ліпперт .
reinierpost

1

Типи качок - це не зовсім підмножина поліморфізму, оскільки поліморфізм вимагає чіткості, яка втрачається при наборі качок. Отже, набравши качок, ви маєте шанс "реалізувати" "інтерфейс" не тому, що це має смисловий сенс, а тому, що у вас однаковий підпис. Якби типізація качок була підмножиною поліморфізму, то вона мала б усі властивості поліморфізму, включаючи явну декларацію.

Введення качок також насправді не є реалізацією поліморфізму, це частина системи іншого типу. Зазвичай ви асоціюєте введення качки з динамічною мовою, яка йде вперед і передає повідомлення об'єкту, не знаючи, чи може об’єкт впоратися з ним - якщо він зможе, то він ефективно пройшов тест набору качки. Зазвичай ви вважаєте, що поліморфізм реалізовується під час компіляції шляхом встановлення vtables (і itables, якщо інтерфейси відрізняються від класів). Але є багато мов там і багато способів реалізувати ці функції.

Певною мірою це філософське питання. Чи можете ви думати про тип качки як інтерфейси, які автоматично оголошуються неявно? Я точно не можу придумати будь-яку причину, яка є неправильною , але я не думаю, що це, мабуть, найпродуктивніший спосіб. Я думаю, що типи качок та інтерфейси є як часто зустрічаються особливостями систем типу мов програмування, обидва мають досить схожі способи поведінки, і обидва важливі для розуміння програмістами.


6
"поліморфізм вимагає явного" де це так сказати? наслідування на основі класу - це лише форма поліморфізму, не єдина.
Хав'єр

І продовжуючи коментар @ Хав'єра, як щодо спеціального поліморфізму ?
янніс

@YannisRizos - Проблема з відповіддю на будь-яке запитання на кшталт цього є так багато мов і стільки термінології, що хтось може вибирати вас, незалежно від того, що ви говорите. Я розумію, чому "ad hoc polymorphism" має в назві слово "polymorphism", але я б заперечував, що це щось інше, ніж те, що ОП означає "поліморфізм".
psr

@Javier - Усі перелічені вами методи вимагають чіткості, крім набору тексту качки.
psr

@psr Насправді мені байдуже, що ОП означає "поліморфізм". Я не думаю, що нікого не повинно хвилювати, це наукова концепція з дуже простим визначенням, я не думаю, що ми повинні відповідати, грунтуючись на власних інтерпретаціях або на тому, що ми можемо вважати, що це тлумачення ОП. Особливо тлумачення ОП, оскільки він просить цього за замовчуванням, він не впевнений у своєму тлумаченні. Я не погоджуюсь, що це філософське питання, як заявлене питання було науковим з однією простою відповіддю: так, каченя - це форма спеціального поліморфізму, одного підмножини поліморфізму.
янніс

1

Дуже природно говорити "Так, якщо у фоо є напис качок, у фоа поліморфізм". Але я не можу сказати, що це на 100% впевнено, в сенсі, що, можливо , можна придумати штучні приклади такої системи, яка набирає качок ("чи може вона стукати & & чи може вона плавати на воді ==> це Качка ") не маючи поліморфізму (" foo, quack! "Не вдається), але вони справді були б штучними і в реальному світі я б сказав" Так, якщо типи качок є, поліморфізм також повинен бути присутнім ".

Особисто я бачу, як качка друкує як "поліморфізм, зроблений правильно". Що я маю на увазі під тим, що речі, які існують у світі, що друкують качок, не повинні мати явних типів, а їх поведінка (поліморфна = "той самий доступ, різний результат") - це єдине, що враховується. В інших реалізаціях поліморфізму він обмежений типами / інтерфейсами / успадкування, тому він "реалізований і обмежений поліморфізм", а не "поліморфізм як такий".


0

Статично типізовані мови програмування дозволяють проводити попередню перевірку помилок, краще застосування дисциплінованих стилів програмування та генерування більш ефективного об'єктного коду, ніж мови, де під час виконання всіх перевірок узгодженості типів виконуються.

(Б. Пірс та друзі)

Отже, як ви можете зауважити, у цьому відношенні набір качок - це динамічне набирання тексту, яке дійсно не працює.

Існує певний метод визначення типу, який стосується поліморфінгу, наприклад, що робить код більш гнучким, але введення качок - це ще одна проблема в цих випадках.

Докладно описано обчислення лямбда та нетипізоване обчислення лямбда, які допомагають визначити властивість обчислення та обчислення.

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

Це мої п’ять центів, і я думаю, що це може зробити цікаву тему дослідження.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.