質問

ミックスインとトレイトの違いは何ですか?

ウィキペディアによると, Rubyモジュールはトレイトのようなものです。どうして?

役に立ちましたか?

解決

  1. ミックスインには状態が含まれる場合がありますが、(従来の) トレイトには含まれません。
  2. ミックスインは「暗黙的な競合解決」を使用し、トレイトは「明示的な競合解決」を使用します。
  3. ミックスインは線形化に依存し、特性はフラット化されます。

特性についての講義

広告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/mixin.htmlする

http://dlang.org/traits.htmlする

この文脈において、

ミックスインオンザフライで生成されたコードであり、その後、コンパイル時にコードにその時点で挿入されます。簡単なDSLのための非常に便利ます。

形質は、コンパイル時、外部の値(というよりも外部ソースから生成されたコード)です。違いは微妙です。ミックスインのロジックを追加し、形質は、コンパイル時の型情報などのデータを追加します。

ルビーについて多くを知っているが、これはやや支援を期待しないでください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top