使用scala构造函数设置trait中定义的变量

时间:2011-11-18 06:29:27

标签: scala constructor traits

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

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

trait Foo {
    var foo: String
}

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

我希望在制作foo对象时设置了Bar特征的字符串。

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

2 个答案:

答案 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化代码之外的方法中使用。但您可以通过标记valvar强制行为,并可能控制可见性,如

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

您需要公开var来实施Foo