Scala:重写的值父代码是 运行 但未在父级分配值

Scala: Overridden value parent code is run but value is not assigned at parent

运行 代码如下:

class Parent {
  val value = {
    println("Setting value in parent")
    "ParentVal"
  }
  println(s"Parent value is ${value}")
}

class Child extends Parent {
  override val value = {
    println("Setting value in child")
    "ChildVal"
  }
  println(s"Child value is ${value}")
}

new Child

产生这个输出:

Setting value in parent
Parent value is null
Setting value in child
Child value is ChildVal

因此与父值赋值关联的代码是 运行,但是该值并未真正在父级赋值。之后子代码 运行s 并按预期分配值。

有人可以在较低层次上解释这里的事件链吗?

你可以把val想象成一个没有setters的私有成员变量+一个getter方法的组合。如果你在没有 vals 的情况下重写你的代码,它会是这样的:

class Parent {
  private[this] var parentValue = {
    println("Setting value in parent")
    "ParentVal"
  }
  def value: String = parentValue
  println(s"Parent value is ${value}")
}

class Child extends Parent {
  private[this] var childValue = {
    println("Setting value in child")
    "ChildVal"
  }
  override def value = childValue
  println(s"Child value is ${value}")
}

new Child

与原来一样,它打印:

Setting value in parent
Parent value is null
Setting value in child
Child value is ChildVal

这是因为父构造函数调用了方法value,但是这个方法被def value = childValue覆盖了。返回的childValuenull,因为调用父构造函数时,还没有调用子构造函数

您可以阅读有关 object initialization order here 的更多信息。


相关回答:

  1. .