使用私有构造函数参数扩展特征
在Scala中,如何使用特性中定义的私有构造函数参数来扩展类中的特征?
trait Parent {
protected def name: String
require(name != "", "wooo problem!")
}
class Child(private val name: String) extends Parent {
println("name is " + name)
}
上面的类给出了一个错误:
类子节点必须是抽象的,因为特性中的方法名称⇒字符串的父节点未定义。
当然,我可以:
Child
类抽象化, class Child(val name: String)
的构造函数中不使用私有定义它。 abstract class
而不是特征 但是通过上面的实现,在扩展特质的时候,我没有办法拥有私有构造函数参数吗? 请注意,我希望变量是私人的,以便我不应该能够执行childInstance.name
。
尝试这个
trait Parent {
protected def name: String
require(name != "", "wooo problem!")
}
class Child(override protected val name: String) extends Parent {
val publicVar = "Hello World"
println("name is " + name)
}
def main(args: Array[String]): Unit = {
val child = new Child("John Doe")
println(child.publicVar)
println(child.name) // Does not compile
}
您将无法访问child.name
如果你在一个特征中有一个抽象方法,那么所有派生类都需要对抽象方法有相同(或者更宽容)的修饰符(至少在你的情况下是受保护的)。
trait Parent {
protected def name: String
require(name != "", "wooo problem!")
}
class Child(private val privateName: String) extends Parent {
override protected def name: String = privateName
println("name is " + name)
}
你可以保持你的构造函数是私有的,但是你需要定义override protected def name: String
并且利用你的构造函数的私有值。