Apa perbedaan antara pewarisan dengan subtyping?

15

Dalam perspektif bahasa pemrograman, apa yang dimaksud dengan subtyping? Saya mendengar bahwa "Warisan bukan Subtipe". Lalu apa perbedaan antara pewarisan dan subtipe?

RoboAlex
sumber
6
Saya ingin tahu apakah pertanyaan ini (dan yang lain-lain seperti itu) mungkin dialihkan ke situs cs.SE baru ketika memasuki versi beta publik?
Suresh Venkat
1
Selamat datang di cstheory, situs tanya jawab untuk pertanyaan tingkat penelitian dalam ilmu komputer teoretis (TCS). Pertanyaan Anda tampaknya bukan pertanyaan tingkat penelitian di TCS. Silakan lihat FAQ untuk informasi lebih lanjut tentang apa yang dimaksud dengan ini dan saran untuk situs yang mungkin menyambut pertanyaan Anda. Akhirnya, jika pertanyaan Anda ditutup karena berada di luar ruang lingkup, dan Anda yakin Anda dapat mengedit pertanyaan untuk menjadikannya pertanyaan tingkat penelitian, jangan ragu untuk melakukannya. Penutupan tidak permanen dan pertanyaan dapat dibuka kembali, periksa FAQ untuk informasi lebih lanjut.
Kaveh
3
@UdayReddy: Tidak ada pertanyaan yang tidak sepele ketika pertama kali dijawab, tetapi kita harus membuat keputusan dari sudut pandang modern. Argumen yang sama seperti Anda akan menyiratkan bahwa pertanyaan tentang algoritma Dijkstra adalah pada topik karena makalah pertama berbicara tentang hal itu dan tidak ada yang lain.
Tsuyoshi Ito
3
@TsuyoshiIto Analogi ini tidak tepat karena makalah pertama Dijkstra menyelesaikan masalah sedangkan makalah pertama Cardelli di sini menciptakan masalah. Meski begitu, saya mengambil poin Anda bahwa kami tidak mengukur keadaan seni berdasarkan kertas pertama. Izinkan saya meyakinkan Anda bahwa perbedaan antara pewarisan dan subtipe tidak mewakili masalah yang diselesaikan, dan saya mengantisipasi bahwa masalah tersebut akan diperdebatkan setidaknya selama 20 tahun ke depan. Penanya mungkin disarankan untuk melakukan beberapa pekerjaan rumah tambahan dan mengedit pertanyaan untuk mengklarifikasi masalah tingkat penelitian.
Uday Reddy
3
Bagaimanapun, cukup mudah untuk mengarahkan kertas OP ke Cook et al dengan nama yang sama: citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.102.8635
Andreas Rossberg

Jawaban:

18

[Aku belum berpikir mendalam tentang masalah sistem tipe berorientasi objek, tapi aku akan mengatakan apa yang aku tahu agar diskusi berjalan.]

Kami mengatakan bahwa adalah subtipe dari B jika semua nilai bertipe A dapat digunakan dalam setiap konteks di mana nilai bertipe B diharapkan. Atau, dengan kata lain, nilai-nilai A bisa "menyamar" sebagai nilai B- type.SEBUAHBSEBUAHBSEBUAHB

SEBUAHB

Subtyping struktural tidak memastikan subtyping perilaku karena struktur tipe mungkin cocok untuk alasan yang tidak disengaja. Namun, mendefinisikan perilaku yang diharapkan tidaklah mudah. Jadi, banyak bahasa pemrograman menggunakan titik perantara, di mana pengguna harus menyatakan jenis subtipe yang mana. Ini disebut sebagai "subtyping nominal" . Lihat pertanyaan tentang subtyping tersirat vs eksplisituntuk diskusi tentang masalah ini. Idenya adalah bahwa programmer harus memastikan subtyping perilaku untuk semua subtipe yang dinyatakan menggunakan kecerdikannya sendiri. Bahasa tidak dapat menawarkan bantuan apa pun. Namun, semua subtipe yang dideklarasikan harus setidaknya subtipe struktural. Jika tidak, program akan gagal mengetik cek. Bahasa dapat membantu memastikan hal ini. (Beberapa bahasa pemrograman tidak memiliki sistem tipe yang cukup baik untuk memastikan hal ini pada waktu kompilasi. Jika demikian, kegagalan jenis akan terdeteksi pada saat run-time, atau mungkin hasil yang salah dapat dihasilkan. Lubang jenis seperti itu jelas tidak diinginkan.)

Ketika seseorang mendefinisikan subclass dalam program berorientasi objek, satu biasanya menambahkan bidang yang terlihat secara publik (atau metode). Dalam sebagian besar bahasa pemrograman, subclass tersebut dianggap sebagai subtipe nominal . Pertanyaannya adalah apakah mereka juga struktural subtipe . Jika tidak, yaitu, bahasa pemrograman memungkinkan seseorang untuk mendeklarasikan subtipe nominal yang bukan subtipe struktural, maka akan ada lubang ketik dalam bahasa pemrograman.

Dalam kasus sederhana, menambahkan bidang berfungsi dengan baik. Jenis superclass mengharapkan lebih sedikit bidang daripada jenis subclass. Jadi, jika Anda mencolokkan instance dari subclass di mana instance dari sueprclass diharapkan, program hanya akan mengabaikan bidang tambahan yang disediakan dan tidak ada yang salah.

Namun, jika superclass atau subclass memiliki metode yang mengambil argumen dengan tipe yang sama seperti itu sendiri, atau mengembalikan hasil dari tipe yang sama seperti itu sendiri, maka timbul masalah. Maka tipe antarmuka dari subclass bukanlah subtipe struktural dari yang dari superclass. Bahasa pemrograman yang aman digunakan secara luas seperti Java tidak mengizinkan subclass semacam itu. Jadi, mereka membatasi bahasa untuk mendapatkan keamanan jenis. Bahasa pemrograman Eiffel dikatakan telah mengorbankan keamanan jenis untuk mendapatkan fleksibilitas . Jika seseorang mendesain sistem tipe kuat yang mempertahankan fleksibilitas, seseorang harus melepaskan prinsip bahwa subkelas memunculkan subtipe. Oleh karena itu judul makalah "Warisan bukan subtipe" . Para penulis mengusulkan gagasan berbeda subtipe tingkat tinggi yang berfungsi sebagai gantinya. Kim Bruce juga memiliki proposal terkait erat yang disebut "cocok" yang mencapai efek yang sama. Lihat presentasi ini . Juga bermanfaat adalahposisi kertas Andrew Black.

Komunitas semantik mungkin salah karena sebagian besar mengabaikan masalah. Kami secara tradisional menganggapnya sebagai masalah rekayasa sistem tipe praktis yang sedikit menarik secara teoritis. Jika bukan itu masalahnya dan memang ada beberapa semantik yang bekerja di daerah tersebut, saya harap orang lain akan menyebut mereka.

Uday Reddy
sumber
1
Mungkin juga perlu disebutkan bahwa ada bahasa aktual di luar sana yang telah berhasil memisahkan subtipe dari pewarisan, misalnya Ocaml dalam sistem objeknya.
Andreas Rossberg
@AndreasRossberg Memang, OCaml tidak ada dalam bingkai saya ketika saya menulis jawaban itu. Saya kira OCaml tidak memiliki subtyping nominal sama sekali. Jadi, beberapa masalah ini tidak akan muncul. Tetapi ada kemungkinan bahwa tipe mungkin cocok secara tidak sengaja bahkan jika perilakunya tidak, dan sistem tipe tidak akan dapat membantu menangkap kesalahan semacam itu.
Uday Reddy