16.4. Kwalifikowany dostęp prywatny
Istnieje inna forma wykorzystania modyfikatora private, mająca postać private[T], gdzie T jest identyfikatorem pakietu, klasy lub obiektu obejmującego bezpośrednio lub pośrednio modyfikowaną definicję. Taki modyfikator powoduje, że oznaczona nim definicja jest dostępna z kodu znajdującego się wewnątrz tego pakietu, klasy lub obiektu. W przypadku, gdy T oznacza klasę, dostęp jest również możliwy z jej obiektu towarzyszącego. W przypadku, gdy T oznacza obiekt, dostęp jest również możliwy z jej klasy towarzyszącej.
Plik QualifiedPrivate1.scala: object Hello { object Hi { private[Hello] def speak = println("Hi!")
} def hi = Hi.speak
} class Hello { def hi2 = Hello.Hi.speak
}
W przykładzie z pliku QualifiedPrivate1.scala, w definicji metody
hi z wiersza
można się odwołać do metody speak obiektu Hi,
mimo jej oznaczenia modyfikatorem private (wiersz
), gdyż ten
modyfikator jest kwalifikowany obiektem Hello, a metoda hi jest
definiowana w tym właśnie obiekcie. Możliwy jest również dostęp do
metody speak z klasy Hello w wierszu
. Natomiast dostęp do metody
speak spoza obiektu Hello i jej klasy towarzyszącej nie jest możliwy (wiersz
).
scala> Hello.hi Hi! scala> (new Hello).hi2 Hi!
scala> Hello.Hi.speak<console>:11: error: method speak in object Hi cannot be accessed in object Hello.Hi Hello.Hi.speak ^
Błędem jest kwalifikowanie modyfikatora private nazwą nie dotyczącą obejmującego pakietu, klasy lub obiektu.
Plik QualifiedPrivate2.scala: class Hello object Hi { private[Hello] def speak = println("Hi!") }
W przykładzie z pliku QualifiedPrivate2.scala obiekt Hi jest zdefiniowany poza klasą Hello, co skutkuje błędem kompilacji.
$ scalac QualifiedPrivate2.scala
QualifiedPrivate2.scala:3: error: Hello is not an enclosing class
private[Hello] def speak = println("Hi!")
^
one error found
Plik QualifiedPrivate1.scala:
object Hello {
object Hi {
private[Hello] def speak = println("Hi!") 