如果我理解正确,特征是最接近Java接口的东西,类构造函数会自动设置变量。
但是如果我有一个扩展特征的类并且有一个从特征中设置变量的构造函数,那么会是这样的:
trait Foo {
var foo: String
}
class Bar (foo: String) extends Foo { /* ... */ }
我希望在制作foo
对象时设置了Bar
特征的字符串。
编译器似乎给我错误。实现这一目标的正确方法是什么?
答案 0 :(得分:33)
trait Foo { var foo: String = _ }
class Bar(foo0: String) extends Foo { foo = foo0 }
该特征宣告未初始化的var;然后该类将其设置为等于输入参数。
可替换地,
trait Foo {
def foo: String
def foo_=(s: String): Unit
}
class Bar(var foo: String) extends Foo {}
声明对应于foo的getter / setter对,它们由类设置。
答案 1 :(得分:26)
Bar
必须在var foo
中定义摘要Foo
(对于val
将是相同的)。这可以在构造函数
class Bar(var foo: String) extends Foo{...}
(当然,它也可以在Bar
的身体中完成)。默认情况下,如果需要,构造函数参数将转为私有val
,即如果它们在initia化代码之外的方法中使用。但您可以通过标记val
或var
强制行为,并可能控制可见性,如
class X(protected val s: String, private var i: Int)
您需要公开var
来实施Foo
。