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!