1. ホーム
  2. multiple-inheritance

[解決済み] ミキシン vs. トレイツ

2022-05-30 16:55:21

質問

MixinとTraitの違いは何ですか?

ウィキペディアによると Rubyモジュールは特質みたいなものだそうです。どうなんでしょう?

どのように解決するのですか?

  1. Mixin は状態を含むことができますが、(従来の) trait はそうではありません。
  2. ミキシンは暗黙の衝突解決("implicit conflict resolution)を使用し、traitは明示的な衝突解決("explicit conflict resolution)を使用します。
  3. Mixins は線形化に依存し、trait は平坦化される。

traitsについてのレクチャー

広告 1. mixinではインスタンス変数を定義することができます。traitsではこれができません。状態は構成するクラス(=traitを使用するクラス)が提供する必要があります。

広告 2. 名前の衝突があるかもしれません。二つのミキシン ( MAMB ) または特性 ( TATB ) は、同じ定義を持つメソッドを定義します。 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'
    }
}

mixinでは、クラスを構成する際のコンフリクトを解消するために C mixins MA, MB は暗黙的に解決されます。

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

これは foo():void から MA

一方、Traitを使う場合、合成クラスはコンフリクトを解決しなければなりません。

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

このコードでは衝突が発生します。 foo():void ).

広告 3. メソッドのセマンティクスは、それがtraitで定義されているか、traitを使用するクラスで定義されているかには依存しない。

言い換えれば、クラスがTraitで構成されているか、Traitのコードがクラスに"コピー"ペーストされているかは重要ではありません。