使用scala构造函数来设置trait中定义的variables
如果我理解正确,特征是最接近的Java接口和类构造函数自动设置variables。
但是如果我有一个扩展特性的类,并且有一个构造函数从特性中设置一个variables,那么如果是这样的话:
trait Foo { var foo: String } class Bar (foo: String) extends Foo { /* ... */ }
当我制作一个Bar
对象的时候,我想让这个特质的foo
string被设置。
编译器似乎给了我这个错误。 什么是实现这一目标的正确方法?
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对。