ミックスインとトレイト


回答:


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

特性についての講義

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. メソッドのセマンティクスは、それが特性で定義されているか、特性を使用するクラスで定義されているかに依存しません。

つまり、クラスが特性で構成されているか、特性コードがクラスに「コピーして貼り付けられている」かは関係ありません。


5
私はそれが1年前の日付であることを知っていますが、将来の読者のために、ルビでは混合された最後のモジュールからメソッドを使用するので、MBからfoo()を呼び出します
rik.vanmechelen

4
Scalaの特性ではフィールドを持つことができますが、これはそれらが「伝統的な」特性ではないことを意味しますか?
セルジオ

4
はい、これらは「伝統的」ではなく、「ステートフル」特性と呼ばれています。ステートフル特徴とミックスインとの差が点2と3である
jk_

7
暫定-1; 「trait」と「mixin」という用語が実際に使用されている方法は非常に一貫性がなく、ここで少なくとも1つのポイントが間違っています。PHPとWikipedia(および@SergioによるとScala)は、特性がステートレスであることについてあなたに反対しています。この回答は裸の主張で構成されているため、私はこの回答が役に立たないと思います。これは、これらの単語を個人的に使用する方法以外の何であるかは不明です。そうでないと確信するには、クレームを裏付けるために、現実の世界(たとえば、実際のプログラミング言語)でこれらの用語がどのように使用されているかについて、多くの例を見る必要があります。
Mark Amery 2014年

3
@AykutKllic線形化->「コンパイラーは、あいまいさなしに、スーパーとは何かという問題を解決します。」(ibm.com/developerworks/library/j-jn8
ベン

9

これらのページでは、Dプログラミング言語の違いについて説明します。

http://dlang.org/mixin.html

http://dlang.org/traits.html

このコンテキストのミックスインは、オンザフライで生成されたコードであり、コンパイル時にコードのその時点で挿入されます。シンプルなDSLには非常に便利です。

特性は、(外部ソースから生成されたコードではなく)コンパイル時の外部値です。違いは微妙です。Mixinsはロジックを追加し、Traitsはコンパイル時の型情報などのデータを追加します。

Rubyについてはあまり知りませんが、これがある程度役立つことを願っています。


41
DのMixinとTraitsは、コンピュータサイエンスでの一般的な用語の意味とは完全に異なります。Dでは、どちらも自動コード生成用のプリプロセッサプリミティブです。他の言語では、それらは継承メカニズムです。Dでの命名の決定は残念です。
tylerl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.