如何调用具有约束访问权限的子类构造函数?

时间:2017-09-12 10:36:29

标签: scala constructor scope

我有类似下面的内容,我想编译

trait T{
  def a: Int
}

class A private(val a: Int, a2: Int) extends T{
  def add(b: Int): A = new A(a + b, a2 + 2*b)
}

object T{
  def make(a: Int): A = {
    new A(a, 2*a) // doesn't compile
}

这里的A类有一个私有构造函数,因为我想要构造A的唯一方法是通过构造函数T.make或更新的方法A.add(在这个例子中都是garantie a2 = 2 * a)。

但是因为A构造函数是私有的,所以它不能被父特征T访问。同样适用于受保护的。基本上,我需要一个反向保护?

注意:一个不令人满意的解决方案是降低(太多)对A构造函数的限制,也许是对package-private。但我不希望任何其他建筑可能,但计划的那些。我可以将约束降低到当前文件中的所有代码,但我也不知道如何做到这一点。

2 个答案:

答案 0 :(得分:3)

也许您应该将make(..)放入类A的伴随对象而不是特征T的伴随对象。

  object A  {
    def make(a: Int): A = {
      new A(a, 2 * a) 
    }
  }

答案 1 :(得分:3)

一些选择。

  • 您可以将object T重命名为object A - 然后它就可以访问A的私人会员

  • 您可以将class A内部设为object T - 然后您可以使构造函数private[T]T有权访问它。

  • 您也可以将其设为私有包。当你说它会“过度降低限制”时,你就错了。 scala中的包不必是整个目录。它甚至不需要是整个文件。您可以完全控制其内容,其目的是能够完全按照您在此处所做的操作。