(Catatan: Saya menggunakan 'kesalahan' alih-alih 'masalah' dalam judul karena alasan yang jelas ..;)).
Saya melakukan bacaan dasar tentang Traits in Scala. Mereka mirip dengan Antarmuka di Java atau C #, tetapi mereka memungkinkan untuk implementasi metode standar.
Saya bertanya-tanya: tidak bisakah ini menyebabkan "masalah berlian", yang mengapa banyak bahasa menghindari pewarisan berganda?
Jika demikian, bagaimana Scala menangani ini?
scala
multiple-inheritance
Aviv Cohn
sumber
sumber
Jawaban:
Masalah intan adalah ketidakmampuan untuk memutuskan implementasi metode mana yang harus dipilih. Scala memecahkan ini dengan mendefinisikan implementasi mana yang harus dipilih sebagai bagian dari spesifikasi bahasa ( baca bagian tentang Scala dalam artikel Wikipedia ini ).
Ofcourse, definisi urutan yang sama juga bisa digunakan di kelas multiple inheritance, jadi mengapa repot dengan sifat-sifat?
Alasan IMO adalah konstruktor. Konstruktor memiliki beberapa batasan yang tidak dimiliki metode reguler - mereka hanya dapat dipanggil satu kali per objek, mereka harus dipanggil untuk setiap objek baru, dan konstruktor kelas anak harus memanggil konstruktor induknya sebagai instruksi pertama (instruksi pertama (kebanyakan bahasa akan lakukan secara implisit untuk Anda jika Anda tidak perlu melewati parameter).
Jika B dan C mewarisi A dan D mewarisi B dan C, dan kedua konstruktor B dan C memanggil konstruktor A, maka konstruktor D akan memanggil konstruktor A dua kali. Mendefinisikan yang implementasi untuk memilih seperti Scala lakukan dengan metode tidak akan bekerja di sini karena kedua B dan konstruktor C harus dipanggil.
Sifat menghindari masalah ini karena mereka tidak memiliki konstruktor.
sumber
Scala menghindari masalah intan dengan sesuatu yang disebut "linearisasi sifat". Pada dasarnya, ini mencari implementasi metode dalam sifat-sifat yang Anda perluas dari kanan ke kiri. Contoh sederhana:
Karena itu, daftar sifat yang dicari mungkin berisi lebih dari yang Anda berikan secara eksplisit, karena mereka mungkin memperluas sifat lain. Penjelasan terperinci diberikan di sini: Ciri-ciri sebagai modifikasi yang dapat ditumpuk dan contoh yang lebih lengkap dari linierisasi di sini: Mengapa tidak banyak pewarisan?
Saya percaya pada bahasa pemrograman lain perilaku ini kadang-kadang disebut sebagai "Metode resolusi urutan" atau "MRO".
sumber