首页 文章

在Scala中覆盖vals

提问于
浏览
2

我试图在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
}

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

在我的特定情况下,我 cannot 将其作为类参数传递 .

2 回答

  • 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
    
  • 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"
    }
    

    您也可以使 strlazy ,但这很容易以这种方式结束初始化顺序问题 .

相关问题