如何编写一个可以用两个字段扩展两个字段的类?

Joh*_*ood 2 scala traits

我希望有一个B级,可以用两个字段A_1和A_2两个字段进行扩展.重要的是,B类本身没有这两个字段,因为B类也应该能够在没有这些字段的情况下使用.

我的第一个想法:

trait A_1 { val x: Int }
trait A_2 { val y: Int }
class B
Run Code Online (Sandbox Code Playgroud)

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

我的第二个想法:

trait A_1 { var x: Int = _}
trait A_2 { var y: Int = _}
class B
Run Code Online (Sandbox Code Playgroud)

然后可以在创建B对象后设置字段:

val b = new B with A_1 with A_2
b.x = 1
b.y = 2
Run Code Online (Sandbox Code Playgroud)

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

我的第三个想法:

class A_1 (val x: Int)
class A_2 (val y: Int)
Run Code Online (Sandbox Code Playgroud)

但是B类不允许扩展多个类,所以这个想法不起作用.

有哪些可能性来实现这种情况?有没有比想法2更好的方法?

Nic*_*las 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
Run Code Online (Sandbox Code Playgroud)

  • 它也是一个匿名类.如missfaktor所指出的那样,差异在于他使用早期初始化,而我使用"标准"初始化.差异很微妙.可能是这篇文章将帮助您理解它:http://stackoverflow.com/questions/4712468/in-scala-what-is-an-early-initializer (2认同)