2つの特性A_1とA_2によって2つのフィールドで拡張できるクラスBが欲しいです。クラスBは、これらのフィールドがなくても使用できるはずなので、クラスB自体にこれらの2つのフィールドがないことが重要です。
私の最初のアイデア:
trait A_1 { val x: Int }
trait A_2 { val y: Int }
class B
ただし、は抽象メンバーであり、クラスBで定義する必要があるnew B with A_1 with A_2
ため、機能しません。x
y
私の2番目のアイデア:
trait A_1 { var x: Int = _}
trait A_2 { var y: Int = _}
class B
次に、Bのオブジェクトを作成した後にフィールドを設定できます。
val b = new B with A_1 with A_2
b.x = 1
b.y = 2
これは機能しますが、後で値を設定する必要があるため、少し見苦しいです。この構造により、クラスも変更可能になります。
私の3番目のアイデア:
class A_1 (val x: Int)
class A_2 (val y: Int)
ただし、クラスBは複数のクラスを拡張することは許可されていないため、このアイデアは機能しません。
この状況を実現するために残されている可能性はどれですか?アイデア2よりも良い方法はありますか?