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. |