使用Scala构造函数设置在特质中定义的变量

47

如果我理解正确的话,traits 是最接近 Java 接口的东西,类构造函数自动设置变量。

但是如果我有一个继承了 trait 的类,并且有一个构造函数,该构造函数从 trait 中设置一个变量,像这样:

trait Foo {
    var foo: String
}

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

当我创建一个Bar对象时,我希望设置trait中的foo字符串。

编译器似乎会报错。实现这个的正确方法是什么?


2
只是一个提醒:特质初始化本身并不简单,加上变量和覆盖,你很快就会使初始化复杂化(我曾经这样做过)。确保你真的需要它。 - CheatEx
2个回答

33
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方法,由类设置。


32

Bar 必须在 Foo 中定义抽象的 var foo(如果是 val 也一样)。这可以在构造函数中完成。

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

(当然,这也可以在Bar的主体中完成)。默认情况下,如果构造函数参数在方法中被使用,则它们将被转换为私有的val。但是您可以通过标记它们为valvar来强制执行此行为,并且可能控制可见性,例如:

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

在这里,您需要一个公共的 var 来实现 Foo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接