Mixins vs. Traits

Jawaban:

214
  1. Mixin mungkin mengandung keadaan, sifat (tradisional) tidak.
  2. Mixin menggunakan "resolusi konflik implisit", sifat menggunakan "resolusi konflik eksplisit"
  3. Mixin tergantung pada linierisasi, sifat diratakan.

Ceramah tentang sifat-sifat

iklan 1. Dalam mixins Anda dapat mendefinisikan variabel instan. Ciri tidak memungkinkan ini. Status harus disediakan dengan membuat kelas (= kelas menggunakan ciri-ciri)

iklan 2. Mungkin ada konflik nama. Dua mixin ( MAdan MB) atau ciri-ciri ( TAdan TB) mendefinisikan metode dengan definisi yang sama foo():void.

Mixin MA {
    foo():void {
        print 'hello'
    }
}

Mixin MB {
    foo():void {
        print 'bye'
    }
}

Trait TA {
    foo():void {
        print 'hello'
    }
}

Trait TB {
    foo():void {
        print 'bye'
    }
}

Dalam mixin konflik dalam penyusunan kelas C mixins MA, MB diselesaikan secara implisit.

Class C mixins MA, MB {
    bar():void {
        foo();
    }
}

Ini akan menelepon foo():voiddariMA

Di sisi lain saat menggunakan Ciri, membuat kelas harus menyelesaikan konflik.

Class C mixins TA, TB {
    bar():void {
        foo();
    }
}

Kode ini akan menimbulkan konflik (dua definisi foo():void).

iklan 3. Semantik dari suatu metode tidak tergantung apakah itu didefinisikan dalam suatu sifat atau dalam kelas yang menggunakan sifat tersebut.

Dengan kata lain, tidak masalah apakah kelas terdiri dari Ciri atau kode Ciri adalah "copy - paste" ke dalam kelas.

jk_
sumber
5
Saya tahu ini tahun lalu, tetapi bagi pembaca di masa depan, di ruby ​​akan menggunakan metode dari modul terakhir yang dicampur, jadi itu akan memanggil foo () dari MB
rik.vanmechelen
4
dalam sifat Scala dapat memiliki bidang, ini menyiratkan mereka bukan sifat "tradisional"?
Sergio
4
Ya, ini bukan "tradisional", mereka disebut "statefull". Perbedaan antara sifat statefull dan mixin adalah poin 2 dan 3.
jk_
7
Tentatif -1; cara istilah 'sifat' dan 'mixin' digunakan di alam liar sangat tidak konsisten dan setidaknya salah satu poin di sini sebagian besar salah. PHP dan Wikipedia (dan menurut @Sergio, juga Scala) tidak setuju dengan Anda tentang sifat-sifat tanpa kewarganegaraan. Saya tidak menemukan jawaban ini berguna karena terdiri dari pernyataan tegas, dan tidak jelas bagi saya bahwa ini lebih dari bagaimana Anda secara pribadi menggunakan kata-kata ini. Untuk diyakinkan sebaliknya, saya perlu melihat banyak contoh tentang bagaimana istilah tersebut digunakan di dunia nyata (misalnya dalam bahasa pemrograman nyata) untuk mendukung klaim Anda.
Mark Amery
3
@AykutKllic Linearization -> "Compiler menyelesaikan pertanyaan tentang apa yang super, tanpa ambiguitas." ( Ibm.com/developerworks/library/j-jn8 )
ben
9

Halaman-halaman ini menjelaskan perbedaan dalam bahasa Pemrograman D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

Mixin dalam konteks ini adalah kode yang dihasilkan dengan cepat, dan kemudian disisipkan pada titik itu dalam kode selama kompilasi. Cukup praktis untuk DSL sederhana.

Ciri adalah nilai eksternal waktu kompilasi (bukan kode yang dihasilkan dari sumber eksternal). Perbedaannya halus. Mixins menambahkan logika, Sifat menambahkan data seperti informasi jenis waktu kompilasi.

Tidak tahu banyak tentang Ruby, tapi harap ini membantu.

Aiden Bell
sumber
41
Mixin dan Ciri-ciri dalam D sama sekali berbeda dari apa arti istilah dalam Ilmu Komputer pada umumnya. Dalam D, keduanya primitif preprocessor untuk pembuatan kode otomatis. Dalam bahasa lain, mereka adalah mekanisme pewarisan. Keputusan penamaan dalam D sangat disayangkan.
tylerl