16.2. Uprawnienia prywatne
Definicje składowych klas mogą zostać poprzedzone modyfikatorem private. Takie składowe są prywatne w ramach klasy, w której są zdefiniowane. Definicja klasy Hello1, z pliku Private1.scala, zawiera jedną metodę prywatną, o nazwie talk, oraz jedną publiczną, o nazwie speak.
Plik Private1.scala: class Hello1(greeting: String) { private def talk = println(greeting) def speak = talk }
W poniższej sesji dostęp z zewnątrz klasy do metody prywatnej talk nie jest możliwy, natomiast wywołanie metody publicznej speak udaje się. W definicji metody speak znajduje się odwołanie do prywatnej metody talk. To odwołanie jest prawidłowe, gdyż znajduje się wewnątrz definicji klasy.
scala> val hi = new Hello1("Hi")
hi: Hello1 = Hello1@6374ef
scala> hi.speak
Hi
scala> hi.talk
<console>:12: error: method talk in class Hello1 cannot be accessed in Hello1
hi.talk
^
Składowe prywatne instancji klasy mogą być wywoływane nie tylko z tej instancji, ale także z innej instancji tej samej klasy.
Plik Private2.scala: class Hello2(greeting: String) { private def speak = println(greeting) def dialog(other: Hello2) { this.speak other.speak } }
Metoda dialog z klasy Hello2, zdefiniowanej w pliku Private2.scala, wywołuje metodę prywatną własnej instancji, a następnie innej instancji tej samej klasy.
scala> val hello = new Hello2("Hello!")
hello: Hello2 = Hello2@9a0cdb
scala> val hi = new Hello2("Hi!")
hi: Hello2 = Hello2@1a21c64
scala> hello.dialog(hi)
Hello!
Hi!
Z kodu zdefiniowanego w obiekcie towarzyszącym można się odwoływać do prywatnych składowych klasy i na odwrót — z kodu znajdującego się wewnątrz definicji klasy można odwoływać się do prywatnych składowych obiektu towarzyszącego.
Plik Private3.scala: object Hello3 { private def dialog(h1: Hello3, h2: Hello3) { h1.speak h2.speak } } class Hello3(greeting: String) { private def speak = println(greeting) def talkTo(other: Hello3) = Hello3.dialog(this, other) }
W przykładzie z pliku Private3.scala, metoda talkTo, zdefiniowana w klasie Hello3, odwołuje się do prywatnej metody dialog obiektu towarzyszącego, a ta z kolei odwołuje się do prywatnej metody swojej klasy towarzyszącej.
scala> val hi = new Hello3("Hi!")
hi: Hello3 = Hello3@1fd9a4d
scala> val hello = new Hello3("Hello!")
hello: Hello3 = Hello3@1e1b4fb
scala> hi.talkTo(hello) Hi! Hello!
Plik Private1.scala:
class Hello1(greeting: String) {
private def talk = println(greeting)
def speak = talk
}
