使用私有构造函数参数

时间:2017-01-27 19:36:00

标签: scala traits

在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中的方法名称类型为⇒字符串的父类型未定义。

当然,我可以:

  1. 使Child类抽象,
  2. class Child(val name: String)之类的构造函数中不使用private来定义它。
  3. 让父母成为abstract class而不是特质
  4. 但是通过上面的实现,在扩展特性时我是否无法拥有私有构造函数参数?请注意,我希望变量是私有的,这样我就无法进行childInstance.name

2 个答案:

答案 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并使用构造函数的私有值。