これが私に頭痛の種となる特性線形化パズルゲームです。私は基本的Node
に定義しequals
、hashCode
他のものと比較するタイプを持っていますNode
。そして、私は余分なデータと一緒にSelector
ラップする可能性のあるタイプを持っているので、それ自体があり、他のデータと比較されます。Node
equals
hashCode
Selector
今、私はとStandalone
を組み合わせたタイプを持っていますが、Node
とSelector
に関して一貫性のない(?)線形化を取得しequals
ますhashCode
:
trait Selector { override def hashCode = 1 }
trait Event extends Selector
trait Node { override def hashCode = 2 }
trait Standalone extends Node with Event
Event
またはStandalone
:のいずれかから拡張すると、すべてが正常になります(より具体的なhashCode 1が呼び出されます) 。
object Single1 extends Event
Single1.hashCode // 1 -- ok
object Single2 extends Standalone
Single2.hashCode // 1 -- ok
この順序で両方から拡張しても問題ありません。
object Compound1 extends Standalone with Event
Compound1.hashCode // 1 -- Ok
しかし、私がこれを行うと、混乱します:
object Compound2 extends Event with Standalone
Compound2.hashCode // 2 -- no!!!!!!!!
小さな.dot図を作成しました(ミックスインは左から右に並べられています):
したがって、線形化ルールを正しく理解していれば、常にhashCode
によって実装されるはずSelector
です。この振る舞いの唯一の説明は、ある種の貪欲で深さ優先の事柄が関係しているということです...?
Standalone
また、いつでも混合されていることを確認するために使用できる手法があれば、 (コピーとからへのコピー以外の)Selector
オーバールールが確実に行われるようになります。これは非常にありがたいことです。Node
equals
hashCode
Selector
Standalone
これはScala2.9.2の場合です。