2

我想要一个 B 类,它可以通过两个特征 A_1 和 A_2 用两个字段扩展。重要的是,B 类本身没有这两个字段,因为 B 类也应该能够在没有这些字段的情况下使用。

我的第一个想法:

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

new B with A_1 with A_2不起作用,因为xandy是抽象成员,需要在 B 类中定义。

我的第二个想法:

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

这可行,但有点难看,因为必须在之后设置值。这种结构也使类可变。

我的第三个想法:

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 回答