是否可以在子类的构造函数中覆盖 val
s 或 def
s?我想在子类的构造函数中将 trait 的成员或抽象类的成员初始化(或设置)为 parameters。
以下是一个例子。
trait A { def memberDef: Int => String val memberVal: String } class B( override val memberDef: Int => String, override val memberVal: String) extends A { ... }
这里,class B
的 memberDef
覆盖 trait A
的 memberDef
和 class B
的 memberVal
覆盖 trait A
的 memberVal
。
当我编译这个时,没有错误。但是,我想知道这个实现是否有任何错误,或者是否有更好的实现。
最佳答案
我想使用早期初始化器添加另一种可能的解决方案:
class B(memberDefParam: Int => String, memberValParam: String) extends {
val memberVal: String = memberValParam
} with A {
val memberDef: Int => String = memberDefParam
}
我会使用它,因为 Martin Odersky 说,如果您使用早期的初始化器,您已经达到了 chalice - L3 级:专家库设计师: http://www.scala-lang.org/old/node/8610
顺便说一句,通过作为构造函数参数提供的函数覆盖公共(public)方法对我来说一点也不好看,但那是另一回事了。
关于Scala:是否可以在子类的构造函数中覆盖 val?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20897043/