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!

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.