16.3. Uprawnienia prywatne w ramach obiektu
Jeśli definicja składowej klasy poprzedzona jest modyfikatorem private[this], to taka składowa jest dostępna tylko z danej instancji, a nie jest dostępna z innej instancji tej samej klasy, ani z jej obiektu towarzyszącego. Analogicznie, jeśli definicja składowej obiektu poprzedzona jest takim modyfikatorem, to nie jest ona dostępna z klasy towarzyszącej.
Definicja klasy Hello1, z pliku PrivateThis1.scala, różni się od definicji tej klasy z pliku Private1.scala tym, że zamiast modyfikatora private, w definicji metody talk znajduje się modyfikator private[this].
Plik PrivateThis1.scala: class Hello1(greeting: String) { private[this] def talk = println(greeting) def speak = talk }
Dostęp do metody talk z metody speak nadal jest dozwolony, a z zewnątrz klasy nadal jest zabroniony.
scala> val hi = new Hello1("Hi")
hi: Hello1 = Hello1@6374ef
scala> hi.speak
Hi
scala> hi.talk
<console>:12: error: value talk is not a member of Hello1
hi.talk
^
W pliku PrivateThis2.scala znajduje się próba podobnej modyfikacji przykładu z pliku Private2.scala. Definicja metody speak zawiera modyfikator private[this].
Plik PrivateThis2.scala: class Hello2(greeting: String) { private[this] def speak = println(greeting) def dialog(other: Hello2) { this.speak other.speak
} }
Kompilacja pliku kończy się błędem. Dostęp do metody speak w wierszu
jest zabroniony, mimo że ta metoda jest zdefiniowana w tej samej
klasie.
$ scalac PrivateThis2.scala
PrivateThis2.scala:5: error: value speak is not a member of Hello2
other.speak
^
one error found
W pliku PrivateThis3.scala znajduje się próba modyfikacji definicji klasy Hello3, z pliku Private3.scala, przez zamianę modyfikatorów private na private[this].
Plik PrivateThis3.scala: object Hello3 { private[this] def dialog(h1: Hello3, h2: Hello3) { h1.speak h2.speak } } class Hello3(greeting: String) { private[this] def speak = println(greeting) def talkTo(other: Hello3) = Hello3.dialog(this, other) }
Również kompilacja pliku PrivateThis3.scala nie udaje się.
$ scalac PrivateThis3.scala
PrivateThis3.scala:3: error: value speak is not a member of Hello3
h1.speak
^
PrivateThis3.scala:4: error: value speak is not a member of Hello3
h2.speak
^
PrivateThis3.scala:9: error: value dialog is not a member of object Hello3
def talkTo(other: Hello3) = Hello3.dialog(this, other)
^
three errors found
Plik PrivateThis1.scala:
class Hello1(greeting: String) {
private[this] def talk = println(greeting)
def speak = talk
}
