所以我理解在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
无效,那么我该如何指定它是哪一个?
为了清楚起见,这纯粹是出于好奇,我实际上并没有尝试在类层次结构中创建一个含糊不清的名称。
编辑:要实际看到它的作用,我实现了以下层次结构:
InnerObject.scala如下:
private[com.mycompany]
InnerObject2.scala几乎完全相同:
object InnerObject {
private val privateVal = 7
private[mycompany] val packagePrivateVal = 8
val regularVal = 9
}
来自OuterObject的,我可以参考:
regularVal并不令人惊讶,因为这是公开的。在查找与object InnerObject2 {
private val privateVal = 7
private[mycompany] val packagePrivateVal = 8
val regularVal = 9
}
的声明匹配的第一个实例之前,包private似乎在层次结构中。那么,任何人都可以告诉我是否/如何使它引用外部的而不是内部的那个?
答案 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将采用它找到的最内层名称,如你所说。
在我看来,这是一件好事,因为重复的名称是多余的,令人困惑。