Mixins ve Özelliklerin Karşılaştırması


Yanıtlar:


214
  1. Mixinler devlet içerebilir, (geleneksel) özellikler içermez.
  2. Mixins "örtülü çatışma çözümlemesi", özellikler "açık çatışma çözümlemesi" kullanır
  3. Karışımlar doğrusallaştırmaya bağlıdır, özellikler düzleştirilir.

Özellikler hakkında konuşma

ad 1. Mixins'de örnek değişkenleri tanımlayabilirsiniz. Özellikler buna izin vermez. Durum, sınıf oluşturularak sağlanmalıdır (= özellikler kullanılarak sınıf)

ad 2. Ad çakışması olabilir. İki karışım ( MAve MB) veya özellik ( TAve TB), aynı tanım ile yöntemi tanımlar 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'
    }
}

Mixins'de sınıf oluşturmadaki anlaşmazlıklar C mixins MA, MB dolaylı olarak çözülür.

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

Bu arayacak foo():voidgelenMA

Öte yandan, Özellikleri kullanırken sınıf oluşturmanın çakışmaları çözmesi gerekir.

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

Bu kod çatışmayı artıracaktır (iki tanımı foo():void).

ad 3. Bir yöntemin anlambilimi, bir özellikte mi yoksa özelliği kullanan bir sınıfta mı tanımlandığına bağlı değildir.

Başka bir deyişle, sınıfın Özellikler'den oluştuğu veya Özellikler kodunun sınıfa "kopyalandığı" önemli değildir.


5
Bir yıl geçmiş olduğunu biliyorum, ama gelecekteki okuyucular için, ruby ​​içinde karıştırılmış son modül form yöntemini kullanır, bu yüzden foo () form MB
rik.vanmechelen

4
Scala özellikleri alanları olabilir, bu "geleneksel" özellikler anlamına gelir?
Sergio

4
Evet, bunlar "geleneksel" değildir, bunlara "durumsal" özellikler denir.
Durum

7
Geçici -1; 'özellik' ve 'mixin' terimlerinin vahşi doğada kullanılma şekli oldukça tutarsızdır ve buradaki noktalardan en az biri çoğunlukla yanlıştır. PHP ve Wikipedia (ve @Sergio, ayrıca Scala'ya göre) vatansız olma özellikleri konusunda sizinle aynı fikirde değiller. Bu cevabı yararlı bulmuyorum çünkü çıplak iddialardan oluşuyor ve bunun bu kelimeleri kişisel olarak nasıl kullandığınızdan daha fazlası olduğu açık değil. Aksine ikna olmak için, terimlerin iddialarınızı desteklemek için gerçek dünyada (örneğin gerçek programlama dillerinde) nasıl kullanıldığına dair birçok örnek görmem gerekir.
Mark Amery

3
@AykutKllic Linearization -> "Derleyici, belirsizliğin ne olduğu süper ne olduğu sorununu çözer." ( ibm.com/developerworks/library/j-jn8 )
ben

9

Bu sayfalarda D Programlama dilindeki fark açıklanmaktadır.

http://dlang.org/mixin.html

http://dlang.org/traits.html

Bu bağlamdaki karışımlar, anında kod oluşturulur ve daha sonra derleme sırasında kodun bu noktasına eklenir. Basit DSL'ler için oldukça kullanışlıdır.

Özellikler derleme zamanı harici değerlerdir (harici bir kaynaktan üretilen kod yerine). Fark incedir. Karışımlar mantık ekler, Özellikler derleme zamanı türü bilgileri gibi veriler ekler.

Ruby hakkında çok şey bilmiyorum, ama umarım bu biraz yardımcı olur.


41
D'deki Karışımlar ve Özellikler genel olarak Bilgisayar Bilimlerinde terimlerin ne anlama geldiğinden tamamen farklıdır. D'de, her ikisi de otomatik kod üretimi için önişlemci ilkeleridir. Diğer dillerde miras mekanizmalarıdır. D'deki adlandırma kararı talihsizdir.
tylerl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.