6.4. Przedrostek super

Zasady dotyczące linearyzacji zilustrować można jeszcze jednym przykładem. Definicje cech, które dziedziczą z cechy SuperGreet i są zdefiniowane w pliku Linearization4.scala, zawierają wyrażenia mające postać super.greet. Nie muszą to być wywołania metody greet z cechy SuperGreet, którą obie omawiane cechy rozszerzają. O tym, która metoda greet zostanie wywołana w rezultacie wykonania wyrażenia super.greet, decyduje kolejność linearyzacji.

Plik Linearization4.scala:
trait SuperGreet {
  def greet = "Greetings"
}
trait SuperHelloGreet extends SuperGreet {
  override def greet = super.greet + " Hello!"
}
trait SuperWelcomeGreet extends SuperGreet {
  override def greet = super.greet + " Welcome!"
}
class SuperGreet2 extends SuperHelloGreet with SuperWelcomeGreet
class SuperGreet3 extends SuperWelcomeGreet with SuperHelloGreet

Klasa SuperGreet2 ma wmieszane cechy SuperHelloGreet i SuperWelcomeGreet, w tej kolejności. Mimo że cecha SuperWelcomeGreet nie dziedziczy z cechy SuperHelloGreet, to wywołanie super.greet w SuperWelcomeGreet powoduje wywołanie metody greet w SuperHelloGreet. Z kolei wywołanie super.greet w SuperHelloGreet powoduje odwołanie do metody greet zdefiniowanej w SuperGreet, a więc w cesze, którą obie z wymienionych cech rozszerzają.

scala> (new SuperGreet2).greet
res0: String = Greetings Hello! Welcome!

Klasa SuperGreet2 ma wmieszane te same dwie cechy, ale w odwrotnej kolejności. W rezultacie, również metody greet zdefiniowane w obu cechach są wywoływane w odwrotnej kolejności.

scala> (new SuperGreet3).greet
res1: String = Greetings Welcome! Hello!

Kolejność wzajemnych wywołań metod greet zależy od kolejności porządku określanego przez linearyzację. W obu klasach: SuperGreet2 i SuperGreet3 ten porządek jest inny, co skutkuje innym porządkiem wzajemnych wywołań metod greet.

Po przedrostku super można umieścić, w nawiasach kwadratowych, nazwę klasy lub cechy, do której chcemy się odwołać, tak jak to jest zrobione w metodzie greet2 klasy SuperGreet4 z pliku Linearization5.scala.

Plik Linearization5.scala:
class SuperGreet4 extends SuperWelcomeGreet with SuperHelloGreet {
  def greet2 = {
    println(super[SuperWelcomeGreet].greet)
    println(super[SuperHelloGreet].greet)
  }
}

Poniższy przykład pokazuje skutek wywołania metody greet2.

scala> (new SuperGreet4).greet2
Greetings Welcome!
Greetings Welcome! Hello!

Specyfikacja języka Scala opisuje przedrostek super w punkcie 6.5.

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.