Mengapa bahasa pemrograman menghasilkan tanda tangan metode tanpa memperhatikan jenis pengembalian?

11

Saya telah bekerja dengan banyak bahasa yang tidak menghasilkan metode tanda tangan berdasarkan tipe pengembalian. Saya juga pernah bekerja dengan satu (mungkin beberapa?) Yang bisa. Yang tidak memberi saya masalah di masa lalu (seperti di sini ). Mengapa bahasa pemrograman menghasilkan tanda tangan metode tanpa memperhatikan jenis pengembalian?

Pembaruan: Saya merujuk khusus untuk mengkompilasi bahasa yang diketik secara statis

Charles Lambert
sumber
Ini adalah dugaan yang sangat tidak berdasar, tetapi saya menduga ini ada hubungannya dengan kesulitan implementasi kompiler dan / atau dukungan alat.
Charles Lambert
Di Haskell, Anda dapat menggunakan kacamata ketik untuk membuat fungsi yang bergantung pada tipe pengembalian. I <3 Haskell: D: D: D
Thomas Eding

Jawaban:

5

Itu tidak akan cocok dengan typecasting dan ketik hierarki. Jika Anda memiliki dua versi metode, yang salah satunya mengembalikan tipe A dan yang mengembalikan tipe B, Anda mengalami masalah ketika:

  • A atau B adalah subtipe satu sama lain, dan Anda menetapkan nilai kembali ke salah satu yang merupakan supertype.
  • A dan B memiliki supertipe umum, dan Anda menetapkan nilai supertipe seperti itu.

Anda bisa menyiasati ini dengan gips, tetapi itu akan membutuhkan banyak mengetik seperti mengubah nama salah satu fungsi. Anda juga bisa mendaftarkan kesalahan kompiler ketika panggilan ambigu, dalam hal ini pengguna perlu menghabiskan upaya yang serupa.

jprete
sumber
1
Saya telah bekerja dengan bahasa yang menyertakan jenis pengembalian dalam tanda tangan. Casting di semua tempat tidak menjadi masalah seperti yang Anda tunjukkan. Dalam contoh spesifik Anda, Anda tidak perlu menyiasati ini dengan gips. Jika A dan B (subtipe C) keduanya memiliki operasi yang sama, maka harus dinyatakan dalam C. Jika tipe pengembalian berbeda untuk A daripada untuk B: Dalam kebanyakan kasus ia mencoba mengembalikan subtipe C. Anda cukup tambahkan metode lain dalam subtipe yang mengembalikan subtipe dan terapkan versi dari C untuk memanggil yang dengan subtipe tertentu. Sekarang Anda tidak perlu membuang semua tempat.
Charles Lambert
@ Charles Lambert: Ini bukan operasi pada kelas A, B, atau C. Ini dua fungsi dengan nama dan daftar parameter yang sama, salah satunya mengembalikan sesuatu dari tipe A dan yang lainnya mengembalikan sesuatu dari tipe B. Pertanyaan ini berlaku untuk lebih dari sekedar sistem OOP, jadi saya menjawab berdasarkan tipe dan fungsi umum. Juga, saya tidak mengerti apa yang ingin dicapai oleh contoh bantahan Anda; diperlukan lebih banyak detail bagi saya untuk menanggapinya.
jprete
Sebuah komentar terlalu pendek untuk sebuah contoh. pastebin.com/JR39PKs0 pada dasarnya bahasa yang menyertakan jenis pengembalian dalam tanda tangan telah muncul dengan cara untuk meringankan masalah yang Anda gambarkan. Baik itu konvensi pengkodean, atau hanya praktik standar. Juga dari catatan, tidak banyak dari apa yang Anda tulis akan menjamin membuat metode yang hanya berbeda dalam jenis pengembalian. Jadi sekali lagi, Anda tidak akan sering berurusan dengan ini
Charles Lambert
Apakah ada kesulitan memiliki aturan bahwa hanya satu metode "primer" dapat dideklarasikan untuk setiap tanda tangan argumen yang diberikan, tetapi sejumlah metode sekunder dapat dideklarasikan, dan kompilator harus melakukan overloading dengan terlebih dahulu mengidentifikasi tanda tangan argumen yang mana Metode primer ada, dan kemudian memeriksa metode sekunder dalam beberapa urutan yang ditentukan untuk melihat apakah ada metode yang cocok lebih baik (atau akan dapat digunakan bahkan jika yang utama tidak)?
supercat
3

Karena Anda dapat memanggil metode dan tidak menetapkan hasilnya.

Chiron
sumber
3
Tidak dalam setiap bahasa.
Jörg W Mittag
@ Jorg Seperti bahasa apa?
Chiron
1
f # adalah satu bahasa. Anda biasanya melihat foo -> diabaikan di mana diabaikan adalah metode dengan tipe pengembalian unit yang mirip dengan void
Charles Lambert
Ada adalah contoh yang lebih baik. Bahasa itu sebenarnya menggunakan tipe kembali sebagai bagian dari tanda tangan juga.
Charles Lambert
-4

Rule of thumb: bahasa yang diketik sangat biasanya mengikat tanda tangan metode ke jenis kembali. Bahasa yang diketik dengan lemah tidak.
Saya tidak tahu C #, tapi saya berasumsi bahwa masalahnya mungkin karena cara C # menangani obat generik. Mungkin menciptakan metode yang sama sekali berbeda untuk yang umum, dalam hal ini mereka benar-benar dua metode yang berbeda.

CMR
sumber
1
Saya ingin tahu bahasa manakah dari bahasa yang diketik dengan sangat baik ini? Saya tidak tahu apa-apa, dan saya tahu C ++ secara eksplisit melarang resolusi ke tipe kembali.
greyfade
2
-1 Jika Anda akan memberikan aturan praktis yang seolah-olah salah dengan satu contoh yang melanggar, Anda harus mengikuti itu dengan semua contoh lain di mana aturan tersebut dipatuhi.
@ Greyfade, maksud saya adalah bahwa dalam bahasa yang diketik dengan lemah tugas tidak diperiksa pada waktu kompilasi. Setuju, itu mungkin tidak relevan di sini.
CMR
Poin Anda dikaburkan oleh pernyataan tidak akurat Anda bahwa "bahasa yang diketik dengan sangat biasanya mengikat ... ke jenis kembali".
greyfade