你能从构造函数中分配一个继承的字段吗?

时间:2013-06-25 18:55:53

标签: scala traits

假设:

trait Foo {
  var foo: Int
}

abstract class Bar(foo: Int) extends Foo

trait Baz {
  self: Bar =>
  foo = 4
}

我收到以下错误:

value foo in class Bar cannot be accessed in Baz with Bar
  foo = 4
  ^

但是,如果我将Bar更改为以下内容:

abstract class Bar(_foo: Int) extends Foo {
  foo = _foo
}

工作正常。有没有办法从构造函数中分配一个继承的字段?它几乎就像它正在影响它。

1 个答案:

答案 0 :(得分:0)

您可以指定继承的字段。你只是有一个阴影问题(你怀疑)。以下工作(Foo未更改):

abstract class Bar(_foo: Int) extends Foo

trait Baz {
  self: Bar =>

  foo = 4
}

请注意,_foo: Int构造函数中的Bar未定义字段foo。但我们现在可以做到:

val x = new Bar(1) with Baz {
  // need to define foo
  var foo: Int = _
}

x.foo
//> res0: Int = 4

您可能希望查看early initializers的内容。