2

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ため、機能しません。xy

私の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よりも良い方法はありますか?

4

2 に答える 2

6

あなたはとても近かった:

scala> trait A1 {val x: Int}
defined trait A1

scala> trait A2 {val y: Int}
defined trait A2

scala> class B
defined class B

scala> new B with A1 with A2 {val x = 4; val y = 2}
res0: B with A1 with A2 = $anon$1@2bc20611
于 2012-06-18T12:19:30.740 に答える
4

ニコラスが提案したこと。

または:

scala> trait A_1 { val x: Int }
trait A_2 { val y: Int }
class B
defined trait A_1
defined trait A_2
defined class B

scala> new { val x = 3; val y = 9 } with B with A_1 with A_2
res3: B with A_1 with A_2 = $anon$1@18e1b

ここで使用される機能は、早期初期化と呼ばれます。

于 2012-06-18T12:22:48.123 に答える