Scala保护了伴随对象中的构造函数和构建器

时间:2011-05-09 13:35:07

标签: scala constructor factory protected

我有一些带有受保护构造函数的类,而工厂方法位于抽象超类的伴随对象中。从Scala 2.9.0.RC4开始,这不再编译了。我通过使构造函数包受保护来“修复”该问题。但我不希望其他类甚至在同一个包中也能调用构造函数。

那我该怎么办?

sealed abstract class A
object A {
  //the factory method, returning either a B or C
  def apply(): A
}
class B protected (...) extends A
class C protected (...) extends A

3 个答案:

答案 0 :(得分:1)

你可以让它们成为对象的私有内部类。

object A {
  private class B extends A
  private class C extends A
}

答案 1 :(得分:1)

由于你需要可以访问模式匹配的类,我建议为它们创建一个新的子包,并使构造函数对该包是私有的。现在只需要更改客户端代码中的import语句。

sealed abstract class A {

}
package myPackage.subPackage {

object A {
  def apply(): A = new B
}

class B private[subPackage] () extends A {

}
}

package other {
  object Foo {
    def foo {
      myPackage.subPackage.A()
      //does not compile: new myPackage.subPackage.B
    }
  }
}

答案 2 :(得分:0)

另一种选择是为A的每个实现创建伴随对象,并将构造委托给此对象中的工厂方法:

sealed abstract class A
object A {
  //the factory method, returning either a B or C
  def apply(): A = {
    if (...) B()
    else C()
  }
}
object B {
  def apply() : B = new B()
}
class B private (...) extends A

object C {
  def apply() : C = new C()
}
class C private (...) extends A