私たちが持っているとしましょう
scala> trait A { val y: Int; val x = 1; val y2 = y + 1 }
scala> trait B { val y: Int = 1; val x: Int; val x2 = x + 1 }
scala> class C extends A with B
次に、との両方 が の値 2 になるはずです。の値がデフォルトの 0 であるため、 mixin すると値 1 になります。同様に、mixinすると値 1になります。さらに、これらが Int ではなく Object である場合、.y2
x2
C
A
B
y2
y
x2
B
A
NullPointerException
私が理想的な世界で望んでいるのは、初期化が怠惰ではなく、初期化の順序が値の依存グラフによって自動的に暗示されることです。つまり、デフォルト値を使用するのではなく、初期化順序を再シャッフルするようにコンパイラに指示する方法です。さらに、私は特性をより小さな特性にリファクタリングしてから、正しい mixin の順序を自分で解決したくありません (5 つの特性を mixin しなければならない巨大なプロジェクトでは、これを解決するのは苦痛です)。
更新:別の言い方をすれば...特性をミックスするとき、特性を互いに重ね合わせると想像しますが、valsに関しては実際にはこのようには機能しません...このように機能させる方法
更新: それが本当に不可能な場合は、「overlay」と呼ばれるキーワードを scala に追加するという行に沿って使用できるタイプセーフの既存の機能要求チケットへのリンクを誰かが共有できれば幸いです。の:
scala> class C overlay A overlay B