ミックスイン vs.特性
-
06-09-2019 - |
質問
ミックスインとトレイトの違いは何ですか?
ウィキペディアによると, Rubyモジュールはトレイトのようなものです。どうして?
解決
- ミックスインには状態が含まれる場合がありますが、(従来の) トレイトには含まれません。
- ミックスインは「暗黙的な競合解決」を使用し、トレイトは「明示的な競合解決」を使用します。
- ミックスインは線形化に依存し、特性はフラット化されます。
広告1.ミックスインではインスタンス変数を定義できます。特性がこれを許可しません。状態はクラス(=トレイトを使用したクラス)を構成することで提供される必要があります
広告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
一方、Traits を使用している間は、クラスを構成する際に競合を解決する必要があります。
Class C mixins TA, TB {
bar():void {
foo();
}
}
このコードは競合を引き起こします (2 つの定義 foo():void
).
広告3。メソッドのセマンティクスは、メソッドがトレイトで定義されているか、トレイトを使用するクラスで定義されているかには依存しません。
言い換えれば、クラスが特性で構成されているか、特性コードがクラスに「コピー&ペースト」されたかは問題ではありません。
他のヒント
これらのページは、Dプログラミング言語の違いを説明します。
http://dlang.org/traits.htmlする
この文脈において、ミックスインオンザフライで生成されたコードであり、その後、コンパイル時にコードにその時点で挿入されます。簡単なDSLのための非常に便利ます。
形質は、コンパイル時、外部の値(というよりも外部ソースから生成されたコード)です。違いは微妙です。ミックスインのロジックを追加し、形質は、コンパイル時の型情報などのデータを追加します。
ルビーについて多くを知っているが、これはやや支援を期待しないでください。