Чому мови програмування генерують підписи методів без огляду на тип повернення?


11

Я працював з багатьма мовами, які не генерують підпис методу на основі типу повернення. Я також працював з одним (може, якийсь?), Який роблять. Ті, які раніше не створювали мені проблем (як тут ). Чому мови програмування генерують підписи методів без огляду на тип повернення?

Оновлення: я конкретно маю на увазі складені статично типовані мови


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

У Haskell ви можете використовувати typeclasses, щоб в основному робити функції, які залежать від типу повернення. I <3 Haskell: D: D: D
Томас Едінг

Відповіді:


5

Він не поєднується з ієрархіями набору та типу. Якщо у вас є дві версії методу, одна з яких повертає тип А, а інша, яка повертає тип В, ​​ви можете зіткнутися з проблемою, коли:

  • A або B є підтипами один одного, і ви присвоюєте повернене значення тому, що є супертипом.
  • А і В мають загальний супертип, і ви присвоюєте таке значення супертипу.

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


1
Я працював з мовами, які включають тип повернення в підпис. Кастинг всюди не є проблемою, як ви вказуєте. У вашому конкретному прикладі вам не потрібно буде обходити це за допомогою кастингу. Якщо A і B (підтипи C) мають однакову операцію, то її слід оголосити в C. Якщо тип повернення відрізняється для A, ніж для B: У більшості випадків він намагається повернути підтип C. Ви просто додайте інший метод підтипу, який повертає підтип і реалізує версію з C, щоб викликати той із конкретним підтипом. Тепер вам не доведеться брати участь у всіх місцях.
Чарльз Ламбер

@Charles Lambert: Це не операція над класами A, B або C. Це дві функції з одним іменем і списком параметрів, одна з яких повертає щось типу A, а інша, яка повертає щось типу B. Це питання стосується на більш ніж просто системи OOP, тому я відповів на основі загальних типів та функцій. Крім того, я не розумію, для чого призначений ваш спростовуючий приклад; більше відповідей потрібно для мене, щоб відповісти на це.
jprete

Коментар занадто короткий для прикладу. pastebin.com/JR39PKs0, в основному, мови, які включають тип повернення в підпис, вже створили способи полегшити опис проблеми. Будь то умова кодування, чи просто стандартна практика. Також зауважте, не багато того, що ви пишете, вимагає створення методів, що відрізняються лише типом повернення. Тож знову, з цим ви б не стикалися дуже часто
Чарльз Ламбер

Чи не виникне труднощів із правилом, що для будь-якого заданого підпису аргументу може бути оголошено лише один "первинний" метод, але довільне число вторинних методів може бути оголошено, і компілятор повинен виконати перевантаження, попередньо визначивши підпис аргументу, для якого Первинний метод існує, а потім перевірка вторинних методів у визначеному порядку, щоб побачити, чи такий метод однозначно краще відповідає (чи був би він корисним, навіть якщо основний не був)?
supercat

3

Тому що ви можете викликати метод, а не призначити його результат.


3
Не всіма мовами.
Йорг W Міттаг

@Jorg Як на якій мові?
Хірон

1
f # - одна мова. Ви часто бачите foo -> ігноруйте, де ignore - це метод, який повертає тип одиниці, подібний до пустоти
Чарльз Ламбер

Ада є кращим прикладом. Ця мова фактично також використовує типи повернення як частина підпису.
Чарльз Ламберт

-4

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


1
Мені цікаво, до якої з цих сильно набраних мов ви посилаєтесь? Я не знаю жодного, і я знаю, що C ++ прямо забороняє роздільну здатність до типу повернення.
greyfade

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

@greyfade, моя думка полягала в тому, що в слабо набраних мовах призначення не перевіряється під час компіляції. Погодьтеся, це може бути не доречним тут.
CMR

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