使用scala构造函数来设置trait中定义的variables

如果我理解正确,特征是最接近的Java接口和类构造函数自动设置variables。

但是如果我有一个扩展特性的类,并且有一个构造函数从特性中设置一个variables,那么如果是这样的话:

trait Foo { var foo: String } class Bar (foo: String) extends Foo { /* ... */ } 

当我制作一个Bar对象的时候,我想让这个特质的foostring被设置。

编译器似乎给了我这个错误。 什么是实现这一目标的正确方法?

Bar必须在Foo定义抽象的var foo (对于val来说是相同的)。 这可以在构造函数中完成

 class Bar(var foo: String) extends Foo{...} 

(当然,这也可以在Bar的身上完成)。 默认情况下,如果需要的话,构造函数参数将被转换为私有值,也就是说,如果它们是在启动代码之外的方法中使用的。 但是你可以通过标记val或者var来强制这个行为,

 class X(protected val s: String, private var i: Int) 

在这里你需要一个公共var来实现Foo

 trait Foo { var foo: String = _ } class Bar(foo0: String) extends Foo { foo = foo0 } 

特质声明一个未初始化的var; 该类然后将其设置为等于input参数。

或者,

 trait Foo { def foo: String def foo_=(s: String): Unit } class Bar(var foo: String) extends Foo {} 

声明对应于由该类设置的foo的getter / setter对。