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

Seb*_*hof 44 constructor scala traits

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

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

trait Foo {
    var foo: String
}

class Bar (foo: String) extends Foo { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

我想要的地方foo当我制作一个Bar物体时,就设置了这个特征的字符串.

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

Rex*_*err 33

trait Foo { var foo: String = _ }
class Bar(foo0: String) extends Foo { foo = foo0 }
Run Code Online (Sandbox Code Playgroud)

特征声明了一个未初始化的变量; 然后该类将其设置为等于输入参数.

或者,

trait Foo {
  def foo: String
  def foo_=(s: String): Unit
}
class Bar(var foo: String) extends Foo {}
Run Code Online (Sandbox Code Playgroud)

声明对应于foo的getter/setter对,它们由类设置.


Did*_*ont 28

Bar必须定义抽象var fooFoo(将是一个相同val).这可以在构造函数中完成

class Bar(var foo: String) extends Foo{...}
Run Code Online (Sandbox Code Playgroud)

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

class X(protected val s: String, private var i: Int)
Run Code Online (Sandbox Code Playgroud)

在这里你需要一个公众var来实施Foo.