在Scala中,如何使用特征中定义的 private 构造函数参数扩展类中的特征?
trait Parent {
protected def name: String
require(name != "", "wooo problem!")
}
class Child(private val name: String) extends Parent {
println("name is " + name)
}
上面的类给出了一个错误:
class Child需要是抽象的,因为tratype中的方法名称类型为⇒字符串的父类型未定义。
当然,我可以:
Child
类抽象,class Child(val name: String)
之类的构造函数中不使用private来定义它。 abstract class
而不是特质但是通过上面的实现,在扩展特性时我是否无法拥有私有构造函数参数?请注意,我希望变量是私有的,这样我就无法进行childInstance.name
。
答案 0 :(得分:2)
试试这个
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
答案 1 :(得分:1)
如果在trait中有抽象方法,那么所有派生类需要为抽象方法提供相同(或更宽容)的修饰符(在您的情况下至少受保护)。
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
并使用构造函数的私有值。