C ++ memiliki multiple inheritance, banyak desain bahasa melarangnya berbahaya. Tetapi beberapa bahasa seperti Ruby dan PHP menggunakan sintaks aneh untuk melakukan hal yang sama dan menyebutnya mixin atau traits. Saya mendengar berkali-kali bahwa mixin / traits lebih sulit untuk disalahgunakan daripada multiple inheritance.
Apa yang secara khusus membuat mereka kurang berbahaya? Apakah ada sesuatu yang tidak mungkin dengan mixin / traits tetapi mungkin dengan C ++ - style multiple inheritance? Apakah mungkin mengalami masalah berlian dengan mereka?
Ini seolah-olah kita menggunakan banyak pewarisan tetapi hanya membuat alasan bahwa itu adalah mixin / traits sehingga kita dapat menggunakannya.
Jawaban:
Ada beberapa masalah dengan pewarisan berganda ketika digunakan dengan kelas penuh penuh, tetapi mereka semua berputar di sekitar ambiguitas .
Ambiguitas muncul dalam beberapa cara berbeda:
x
, dan tipe turunan memintax
, apa yang didapatnya?x
variabel memiliki tipe yang tidak sesuai, Anda bisa menyimpulkannya.f
dengan tanda tangan identik, dan seseorang memanggilf
, yang dipanggil?Dan itu mengabaikan hal-hal seperti pengiriman dinamis, inferensi ketik, pencocokan pola, dan hal-hal lain yang kurang saya ketahui yang menjadi lebih menantang ketika bahasa mendukung banyak pewarisan kelas penuh.
Ciri atau Campuran (atau antarmuka, atau ...) adalah semua konstruksi yang secara khusus membatasi kemampuan jenis sehingga tidak ada ambiguitas. Mereka jarang memiliki apa pun sendiri. Ini memungkinkan komposisi tipe menjadi lebih lancar karena tidak ada dua variabel atau dua fungsi ... ada variabel dan referensi; fungsi dan tanda tangan. Kompiler tahu apa yang harus dilakukan.
Pendekatan umum lainnya yang diambil adalah memaksa pengguna untuk "membangun" (atau mencampur) tipe mereka satu per satu. Alih-alih kelas dasar menjadi mitra yang sama dalam tipe baru, Anda menambahkan satu tipe ke yang lain - menimpa apa pun yang ada di sana (biasanya dengan sintaks opsional untuk menamai ulang dan / atau mengekspos ulang bit yang diganti).
Tergantung pada bahasanya - umumnya menjadi merepotkan atau tidak mungkin untuk menggabungkan implementasi fungsi dan penyimpanan untuk variabel dari beberapa kelas dasar dan mengeksposnya dalam tipe turunan.
Terkadang variasi yang kurang parah akan muncul berdasarkan bahasa Anda, tetapi biasanya tidak. Seluruh sifat dari sifat-sifat tersebut adalah untuk memecahkan ambiguitas semacam itu.
sumber
with
kata kunci di sana.