在Scala中覆盖vals

时间:2016-09-03 17:00:23

标签: scala polymorphism override

我试图在Scala中覆盖val:

var copy = [ ...myArray ]

但这拒绝编译。为什么?我想使用抽象类的值本身覆盖抽象类中的值。怎么做?

在我的特定情况下,我 无法 将其作为类参数传递。

2 个答案:

答案 0 :(得分:4)

Scala编译器不允许在val上使用super。如果您不关心重新评估,可以使用def代替。

trait T{
  def str: String
}

sealed abstract class Test extends T{
  def str: String = "str"
}

class Test1 extends Test{
  def str = super.str + "test1" //super may not be used on value str
}

defined trait T
defined class Test
defined class Test1

答案 1 :(得分:3)

如果你关心它避免重复初始化,你可以将它提取到一个方法中:

sealed abstract class Test extends T {
  lazy val str: String = initStr

  protected def initStr = "str"
}

class Test1 extends Test{
  override protected def initStr = super.initStr + "test1"
}

你也可以让str非 - lazy,但这很容易以这种方式结束初始化顺序问题。