我想要一个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
不起作用,因为x
和y
是抽象成员,需要在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.?
答案 0 :(得分: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
答案 1 :(得分: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
此处使用的功能称为early initialization。