【发布时间】:2017-01-27 19:36:00
【问题描述】:
在 Scala 中,如何使用 trait 中定义的 private 构造函数参数在类中扩展 trait?
trait Parent {
protected def name: String
require(name != "", "wooo problem!")
}
class Child(private val name: String) extends Parent {
println("name is " + name)
}
上面的类报错:
类 Child 需要是抽象的,因为类型 ⇒ String 的 trait Parent 中的方法名称未定义。
当然可以:
- 将
Child类抽象化, - 定义它而不使用构造函数中的私有,如
class Child(val name: String)。 - 将 Parent 设为
abstract class而不是 trait
但是通过上述实现,我无法在扩展 trait 的同时拥有 private 构造函数参数吗?请注意,我希望变量是私有的,这样我就不能执行childInstance.name。
【问题讨论】:
-
你想用这个实现什么?为什么需要带有私有变量的构造函数?你不能只在类中定义私有变量并有一个空的构造函数吗?
-
由于这个类被几个孩子扩展,我不想重复代码。我想我找到了一种方法。如果我在特征
protected中创建变量并将子构造函数更改为Child(name: String),我无法访问外部变量。这对我来说已经足够了! -
你为什么不直接定义
class Child{ private val name = "" }? -
那是因为我希望所有孩子都定义的特征中有一些方法签名。所以在我看来,一个特质更有意义!让我知道我是否错了。抱歉,我应该在问题中提到这一点。