如果我理解正确的话,traits 是最接近 Java 接口的东西,类构造函数自动设置变量。
但是如果我有一个继承了 trait 的类,并且有一个构造函数,该构造函数从 trait 中设置一个变量,像这样:
trait Foo {
var foo: String
}
class Bar (foo: String) extends Foo { /* ... */ }
当我创建一个Bar
对象时,我希望设置trait中的foo
字符串。
编译器似乎会报错。实现这个的正确方法是什么?
如果我理解正确的话,traits 是最接近 Java 接口的东西,类构造函数自动设置变量。
但是如果我有一个继承了 trait 的类,并且有一个构造函数,该构造函数从 trait 中设置一个变量,像这样:
trait Foo {
var foo: String
}
class Bar (foo: String) extends Foo { /* ... */ }
当我创建一个Bar
对象时,我希望设置trait中的foo
字符串。
编译器似乎会报错。实现这个的正确方法是什么?
trait Foo { var foo: String = _ }
class Bar(foo0: String) extends Foo { foo = foo0 }
该特征声明了一个未初始化的变量;类然后将其设置为输入参数。
或者,trait Foo {
def foo: String
def foo_=(s: String): Unit
}
class Bar(var foo: String) extends Foo {}
声明与foo对应的getter/setter方法,由类设置。
Bar
必须在 Foo
中定义抽象的 var foo
(如果是 val
也一样)。这可以在构造函数中完成。
class Bar(var foo: String) extends Foo{...}
(当然,这也可以在Bar
的主体中完成)。默认情况下,如果构造函数参数在方法中被使用,则它们将被转换为私有的val
。但是您可以通过标记它们为val
或var
来强制执行此行为,并且可能控制可见性,例如:
class X(protected val s: String, private var i: Int)
在这里,您需要一个公共的 var
来实现 Foo
。