Чим спадкування відрізняється від підтипу?


15

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


6
Цікаво, чи може це питання (та інші подібні до нього) переадресовуватись на новий сайт cs.SE, коли він переходить у загальнодоступну бета-версію?
Суреш Венкат

1
Ласкаво просимо до cstheory, веб-сайту Q&A для питань рівня досліджень в теоретичній інформатиці (TCS). Ваше запитання не є питанням рівня дослідницької роботи в TCS. Будь ласка, перегляньте поширені запитання для отримання додаткової інформації про те, що розуміється під цим питанням, та пропозиції щодо сайтів, які можуть привітати ваше запитання. Нарешті, якщо ваше запитання закрите для того, щоб воно не вийшло за рамки, і ви вважаєте, що можете відредагувати це питання, щоб зробити його на рівні дослідницького рівня, будь ласка, не соромтеся. Закриття не є постійним, і питання можна повторно відкрити, ознайомтеся з поширеними запитаннями для отримання додаткової інформації.
Каве

3
@UdayReddy: Жодне питання не було тривіальним, коли вперше відповіли, але ми повинні прийняти рішення з сучасної точки зору. Такий же аргумент, як і ваш, означає, що питання щодо алгоритму Діккстри є тематичним, тому що перший документ говорить про це, і нічого іншого.
Цуйосі Іто

3
@TsuyoshiIto Аналогія не є підходящою, оскільки перша праця Дійкстри вирішила проблему, тоді як перший документ Карделлі створив цю проблему. Все-таки я вважаю, що ми не вимірюємо сучасний стан на основі першої роботи. Дозвольте запевнити, що відмінності між успадкуванням та підтипом не є вирішеною проблемою, і я передбачаю, що питання буде обговорюватися ще щонайменше 20 років. Опитуваному може бути рекомендовано зробити кілька додаткових домашніх завдань та відредагувати питання для уточнення питань на рівні дослідження.
Удай Редді

3
У будь-якому випадку, досить просто вказати на однойменний документ Кука та ін.: Citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.102.8635
Андреас Росберг,

Відповіді:


18

[Я не надто замислювався над проблемами об'єктно-орієнтованих типів систем, але скажу те, що знаю, щоб розпочати дискусію.]

АБАБАБ

АБ

Структурне підтипування не забезпечує поведінкове підтипування, оскільки структура типу може збігатися з випадкових причин. Однак визначити очікувану поведінку непросто. Так, у багатьох мовах програмування використовується проміжна точка, де користувач повинен оголосити, який тип є підтипом якого. Це називається "номінальним підтипом" . Дивіться запитання про Імпліцит проти явного підтипудля обговорення цього питання. Ідея полягає в тому, що програміст повинен забезпечити поведінкове підтипування для всіх заявлених підтипів, використовуючи власну винахідливість. Мова не може запропонувати жодної допомоги. Однак усі заявлені підтипи повинні бути принаймні структурними підтипами. В іншому випадку програма не зможе набрати перевірку. Мова може допомогти забезпечити це. (Деякі мови програмування не мають достатньо хороших типів систем, щоб забезпечити це під час компіляції. Якщо так, помилка типу буде виявлена ​​під час виконання, або, можливо, можуть виникнути помилкові результати. Такі отвори типу, очевидно, небажані.)

Коли ви визначаєте підкласи в об'єктно-орієнтованих програмах, зазвичай додаються загальнодоступні поля (або методи). У більшості мов програмування такі підкласи розглядаються як номінальні підтипи. Питання в тому, чи є вони також структурними підтипами. Якщо їх немає, тобто мова програмування дозволяє оголошувати номінальні підтипи, які не є структурними підтипами, то в мові програмування будуть отвори типу.

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

Однак якщо в надкласі або підкласі є методи, які беруть аргументи того ж типу, що й сам, або повертають результати того ж типу, що і сам, тоді виникають проблеми. Тоді тип інтерфейсу підкласу не є структурним підтипом класу надкласу. Широко використовувані безпечні для мови мови програмування, такі як Java, не дозволяють використовувати такі підкласи. Отже, вони обмежують мову, щоб отримати безпеку типу. Кажуть, що мова програмування Ейфеля принесла в жертву безпеку типу, щоб натомість отримати гнучкість . Якщо розробляти систему сильного типу, яка зберігає гнучкість, слід відмовитися від принципу, що підкласи породжують підтипи. Звідси заголовок статті "Спадщина не підписувати". Автори пропонують інше поняття підтипу вищого порядку, яке працює замість цього. У Кіма Брюса також є тісно пов'язана пропозиція під назвою "відповідність", яка досягає того ж ефекту. Дивіться цю презентацію . Також корисним є позиційний документ Ендрю Блек.

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


1
Можливо, варто також згадати, що там існують фактичні мови, які успішно відокремили підтипи від успадкування, наприклад Ocaml в його об'єктній системі.
Андреас Росберг

@AndreasRossberg Дійсно, OCaml не був у моєму кадрі, коли я писав цю відповідь. Я вважаю, що у OCaml взагалі немає номінального підтипу. Отже, деякі з цих питань не виникали б. Але існує ймовірність, що типи можуть збігтися випадково, навіть якщо поведінка цього не відбувається, і система типів не зможе допомогти зловити помилки такого типу.
Удай Редді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.