【问题标题】:Overriding vals in Scala在 Scala 中覆盖 val
【发布时间】:2016-09-03 17:00:23
【问题描述】:

我试图在 Scala 中重写 val,如下所示:

trait T{
  val str: String
}

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

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

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

在我的特殊情况下,我不能将它作为类参数传递。

【问题讨论】:

    标签: scala polymorphism overriding


    【解决方案1】:

    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
    

    【讨论】:

    • 我同意这一点,但您没有更改 OP 的代码。 :) T 应该有 def strTest 应该有 def strTest1 应该有 override def str
    【解决方案2】:

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

    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,但这样很容易导致初始化顺序问题。

    【讨论】:

      猜你喜欢
      • 2011-09-07
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多