Dalam perspektif bahasa pemrograman, apa yang dimaksud dengan subtyping? Saya mendengar bahwa "Warisan bukan Subtipe". Lalu apa perbedaan antara pewarisan dan subtipe?
Dalam perspektif bahasa pemrograman, apa yang dimaksud dengan subtyping? Saya mendengar bahwa "Warisan bukan Subtipe". Lalu apa perbedaan antara pewarisan dan subtipe?
Jawaban:
[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.
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.