Kapan sebaiknya Anda lebih suka pola pewarisan daripada mixin dalam bahasa dinamis?
Dengan mixins, maksud saya pencampuran yang tepat, seperti dalam menyisipkan fungsi dan anggota data ke dalam objek di runtime.
Kapan Anda akan menggunakan, misalnya, pewarisan prototypal alih-alih mixin? Untuk menggambarkan lebih jelas apa yang saya maksud dengan mixin, beberapa pseudocode:
asCircle(obj) {
obj.radius = 0
obj.area = function() {
return this.radius * this.radius * 3.14
}
myObject = {}
asCircle(myObject)
myObject.area() // -> 0
javascript
inheritance
mixins
Magnus Wolffelt
sumber
sumber
Jawaban:
Warisan prototipe sederhana. Ini memiliki keunggulan tunggal dibandingkan mixin.
Itu adalah tautan langsung. jika Anda mengubah prototipe semua yang mewarisi itu diubah.
Contoh menggunakan pd
Jadi pada dasarnya, jika Anda ingin perubahan pada "antarmuka" Lingkaran untuk mencerminkan pada saat dijalankan untuk semua objek yang "menggunakan" fungsinya, maka mewarisi darinya.
Jika Anda tidak ingin perubahan direfleksikan maka campurlah.
Perhatikan bahwa mixin memiliki tujuan lebih dari itu juga. Mixin adalah mekanisme Anda untuk beberapa "warisan".
Jika Anda ingin objek untuk mengimplementasikan beberapa "interface" maka Anda akan harus mencampur beberapa di. Yang Anda gunakan untuk warisan prototipikal adalah salah satu yang ingin perubahan untuk merefleksikan selama run-time, yang lain akan dicampur dalam.
sumber
Perasaan kuda saya memberi tahu saya ini:
Catatan terkait:
sumber
Gunakan tes "Is-a".
Warisan terbatas pada kasus ketika Anda dapat mengatakan "Subclass IS A Superclass". Mereka adalah hal yang sama. "Keju adalah Produk Susu".
Mixin adalah untuk segala sesuatu yang lain. "Keju bisa digunakan dalam sandwich". Keju bukan sandwich, tetapi berpartisipasi dalam sandwich.
PS. Ini tidak ada hubungannya dengan bahasa dinamis. Setiap bahasa pewarisan berganda dengan kompilasi statis (yaitu, C ++) memiliki titik keputusan yang sama.
sumber
Nah, contoh terbaik yang bisa saya berikan kepada Anda adalah Aktor untuk game yang memiliki warisan untuk beberapa hal dasar tetapi menggunakan mixins / plugins untuk fungsi bersama. Fungsi yang dibagikan dapat (langsung dari kode sumber!):
sumber