使用私有构造函数参数扩展特征

在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并且利用你的构造函数的私有值。

    链接地址: http://www.djcxy.com/p/51029.html

    上一篇: Extend trait with private constructor parameter

    下一篇: Overriding the method of a generic trait in Scala