我有类似下面的内容,我想编译
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。但我不希望任何其他建筑可能,但计划的那些。我可以将约束降低到当前文件中的所有代码,但我也不知道如何做到这一点。
答案 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中的包不必是整个目录。它甚至不需要是整个文件。您可以完全控制其内容,其目的是能够完全按照您在此处所做的操作。