Overriding vals in Scala

后端 未结 2 1067
野性不改
野性不改 2020-12-17 05:27

I have tried to override val in Scala as this:

trait T{
  val str: String
}

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

class Test1         


        
相关标签:
2条回答
  • 2020-12-17 05:59

    Scala compiler does not allow to use super on a val. If you are not caring about re-evaluation, you can just use def instead.

    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
    
    0 讨论(0)
  • 2020-12-17 06:07

    If you do care about it avoiding repeated initialization, you can extract it into a method:

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

    You can also make str non-lazy, but it's all to easy to end up with initialization order problems that way.

    0 讨论(0)
提交回复
热议问题