是否可以定义只能从其他特征访问的Scala函数?

时间:2014-11-06 00:06:19

标签: scala

private []或protected []访问修饰符肯定无济于事。目前缺少此功能吗?

1 个答案:

答案 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的第二个实例。