回答:
ad 1. ミックスインでは、インスタンス変数を定義できます。特性はこれを許可しません。状態は、構成クラス(=特性を使用するクラス)によって提供される必要があります。
ad 2.
名前が競合している可能性があります。2つのミックスイン(MA
およびMB
)または特性(TA
およびTB
)は、同じ定義でメソッドを定義し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'
}
}
ミックスインでは、クラスを作成する際の競合C mixins MA, MB
が暗黙的に解決されます。
Class C mixins MA, MB {
bar():void {
foo();
}
}
これはfoo():void
から呼び出しますMA
一方、トレイトを使用している間は、クラスを作成することで競合を解決する必要があります。
Class C mixins TA, TB {
bar():void {
foo();
}
}
このコードは競合を引き起こします(の2つの定義foo():void
)。
ad 3. メソッドのセマンティクスは、それが特性で定義されているか、特性を使用するクラスで定義されているかに依存しません。
つまり、クラスが特性で構成されているか、特性コードがクラスに「コピーして貼り付けられている」かは関係ありません。
これらのページでは、Dプログラミング言語の違いについて説明します。
このコンテキストのミックスインは、オンザフライで生成されたコードであり、コンパイル時にコードのその時点で挿入されます。シンプルなDSLには非常に便利です。
特性は、(外部ソースから生成されたコードではなく)コンパイル時の外部値です。違いは微妙です。Mixinsはロジックを追加し、Traitsはコンパイル時の型情報などのデータを追加します。
Rubyについてはあまり知りませんが、これがある程度役立つことを願っています。