private []或protected []访问修饰符肯定无济于事。目前缺少此功能吗?
答案 0 :(得分:5)
使用语言定义的方法访问限制无法做到这一点,但您可以使用隐式参数来模拟它
// A.scala
trait A {
def foo(i: Int)(implicit accessKey: B.AccessKey) = {
println(s"A = $i")
}
}
// B.scala
object B {
sealed trait AccessKey
}
trait B {
private[B] implicit object AccessKeyInstance extends AccessKey
def bar(a: A) = a.foo(10)
}
// C.scala
trait C {
def bar(a: A) = a.foo(20) // Implicit not found error
}
您只能在特质B中放置一个隐含的AccessKey实例,而特征C将无法访问它。
然而,如果将特征B和C放在单个scala文件中,这个技巧就不起作用;在这种情况下,您将能够创建AccessKey的第二个实例。