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

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

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

trait Foo {
    var foo: String
}

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

在我想要 Bar 对象的时候,我设置了特性的 foo 字符串 .

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

回答(2)

3 years ago

Bar 必须在 Foo 中定义抽象 var foo (对于 val 将是相同的) . 这可以在构造函数中完成

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

(当然,它也可以在 Bar 的主体中完成) . 默认情况下,如果需要,构造函数参数将转为private val ,即如果它们在initiailization代码之外的方法中使用 . 但是你可以通过标记它们 valvar 强制行为,并可能控制可见性,如

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

在这里你需要一个公共 var 来实现 Foo .

3 years ago

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对,它们由类设置 .