Wywołanie "super super"
Bardzo często pojawia się problem jak wywołać metodę, która została zdefiniowana powyżej mojej bezpośredniej nadklasy (superclass) i przedefiniowana (overriden) w tej nadklasie.
Dla lepszego zilustrowania rozwiązania musimy wymyślić sobie jakiś problem... Wyobraźmy sobie hierarchię klas, gdzie klasa C dziedziczy po klasie B, a ta z kolei dziedziczy po klasie A.
Klasa A definiuje metodę "rozmiar" jako:
Teraz klasa B przedefiniowywuje tę metodę aby uwzględnić np. zawsze zawieraną wartość domyślną:
Podczas rozwijania naszej aplikacji pojawia się potrzeba stworzenia nowej klasy, która będzie realizowała usługi (interface) zdefiniowane przez klasę B, ale z lekko zmienioną implementacją wewnętrzną, np. wartości domyślnych może być 0 lub więcej.
W takiej sytuacji pojawia się problem jak obliczyć rozmiar takiego obiektu.
Oczywiście moglibyśmy utworzyć metodę tak, aby po wywołaniu super odjęła jeden i na tym oparła dalsze obliczenia, ale bedzie to działać tylko na zastosowanym tutaj trywialnym przykładzie. Jeżeli natomiast metoda, którą tutaj obrabiamy miałaby charakter aktywny, czyli dokonywałaby modyfikacji w danym obiekcie, to możemy być w lekkich tarapatach, gdy właśnie wykonanej operacji nie da się odwrócić - np. coś własnie sobie skasowaliśmy...
W takiej sytuacji potrzebne jest nam wywołanie super super. Tyle tylko, że Smalltalk nie posiada takiej konstrukcji syntaktycznej (składniowej).
Rozwiązuje się ten problem zmieniając odrobinę sposób w jaki zaimplementowaliśmy metodę "rozmiar" w klasie A. Wprowadza się mianowicie dodatkową metodę "rozmiarPodstawowy":
oraz przedefiniowywuje metodę "rozmiar" w klasie A, aby odwoływała się do nowo stworzonej metody:
Teraz w klasie C możemy wywołać oryginalne zachowanie z klasy A:
size
^self basicSize + defaults size.
|
I to by było na tyle jeśli chodzi o rozwiązanie stosowane w praktyce.
Teraz zapoznamy się z podstawową własnością Smalltalka: "w Smalltalku jest bardzo mało rzeczy niemożliwych". Już wkrótce poprosimy grzecznie Smalltalka, aby nam nasze nieszczęsne "super super" łaskawie wykonał.
cdn...
()
|