Scala:是否有可能在子类的构造函数中覆盖val?

Nae*_*mul 3 overriding scala

是否有可能在子类的构造函数中覆盖vals或defs?我想在子类的构造函数中初始化(或设置)trait的成员或抽象类的成员作为参数.

以下是一个例子.

trait A {
  def memberDef: Int => String
  val memberVal: String
}

class B(
    override val memberDef: Int => String,
    override val memberVal: String)
  extends A {
  ...
}

在这里,class BmemberDef覆盖trait AmemberDef,和class BmemberVal替代trait AmemberVal.

当我编译它时,没有错误.但是,我想知道这个实现中是否有任何错误,或者是否有更好的实现.

Rad*_*sky 5

我想使用早期初始化器添加一个可能的解决方案:

class B(memberDefParam: Int => String, memberValParam: String) extends {
  val memberVal: String = memberValParam
} with A {
  val memberDef: Int => String = memberDefParam
}
Run Code Online (Sandbox Code Playgroud)

我会用这个,因为Martin Odersky说如果你使用早期的初始化程序就可以获得圣杯--L3级:专家库设计师:http: //www.scala-lang.org/old/node/8610

顺便说一下,通过作为构造函数参数提供的函数覆盖公共方法对我来说看起来并不好看,但这是另一个故事.

  • L3真的不是圣杯!如果我可以对柔道进行类比,那么L3就是你的黑带.之后你会有几个等级,奥运奖牌等等.等到你到达宏:) (2认同)