Scala包私有,在包层次结构中具有重复的名称

时间:2014-11-17 20:07:50

标签: class scala private class-hierarchy

所以我理解在Scala中,您可以通过添加修饰符private[packagename]来定义特定包范围内的私有内容,其中packagename(显然)是您希望的包的名称引用是私有的。

所以,例如,让我们说我有一个包com.mycompany.usefulname,其中一些类的字段已声明为private[mycompany] - 这可以在{{1}中的所有内容中访问},以及其他一些事情,比如com.mycompany.usefulname(或简单地在com.mycompany.othername中的事情,如果由于某种原因我把东西放在那里)。

我想知道的是:如果我做了一个糟糕的设计,我的层次结构有两个不同级别,使用相同的名称,例如包com.mycompany,有没有办法指定哪个com.mycompany.mycompany我想要私人内容?基于Package private modifier in Scala 2.8,它似乎对特定的mycompany无效,那么我该如何指定它是哪一个?

为了清楚起见,这纯粹是出于好奇,我实际上并没有尝试在类层次结构中创建一个含糊不清的名称。

编辑:要实际看到它的作用,我实现了以下层次结构:

  • myCompany的
    • myCompany的
      • InnerObject.scala
    • usefulname
      • InnerObject2.scala
    • OuterObject.scala

InnerObject.scala如下:

private[com.mycompany]

InnerObject2.scala几乎完全相同:

object InnerObject {
  private val privateVal = 7
  private[mycompany] val packagePrivateVal = 8
  val regularVal = 9
}
来自OuterObject的

,我可以参考:

  • InnerObject.regularVal
  • InnerObject2.packagePrivateVal
  • InnerObject2.regularVal

regularVal并不令人惊讶,因为这是公开的。在查找与object InnerObject2 { private val privateVal = 7 private[mycompany] val packagePrivateVal = 8 val regularVal = 9 } 的声明匹配的第一个实例之前,包private似乎在层次结构中。那么,任何人都可以告诉我是否/如何使它引用外部的而不是内部的那个?

1 个答案:

答案 0 :(得分:1)

以下是Scala语言规范中的relevant excerpt(链接锚点下的示例):

  

以下代码说明了使用限定私有:

package outerpkg.innerpkg
class Outer {
  class Inner {
    private[Outer] def f()
    private[innerpkg] def g()
    private[outerpkg] def h()
  }
}
  

这里,对方法f的访问可以出现在OuterClass中的任何地方,但不能出现在它之外。对方法g的访问可以出现在包outerpkg.innerpkg中的任何位置,就像Java中的包私有方法一样。最后,对方法h的访问可以出现在包outerpkg中的任何地方,包括其中包含的包。

在规范中的任何地方都没有提及包私有访问修饰符。从这一点来说,我认为没有办法处理包名中的重复路径节点,而Scala将采用它找到的最内层名称,如你所说。

在我看来,这是一件好事,因为重复的名称是多余的,令人困惑。