Start  |  Gry  |  Słowniki *  
 : : Menu
Dla początkujących
Dla praktyków
Język
Wersje
Książki
Smalltalk vs. Java
Wiadomości
Linki
FAQ
Pobierz
Co nowego?
Mapa serwisu
Kontakt
Impressum
Księga gości
Po godzinach
Nakarm głodne dziecko - wejdź na stronę www.Pajacyk.pl
 

Wywołanie "super super"

Artykuł pochodzi ze stron www.speakobjects.com i został opublikowany za zgodą . Oryginalna, najnowsza wersja artykułu znajduje się pod adresem http://www.speakobjects.com/super_super.html.

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:

size

   ^0.

Teraz klasa B przedefiniowywuje tę metodę aby uwzględnić np. zawsze zawieraną wartość domyślną:

size

   ^super size + 1.

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":

basicSize

   ^0.

oraz przedefiniowywuje metodę "rozmiar" w klasie A, aby odwoływała się do nowo stworzonej metody:

size

   ^self basicSize.

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


()


SelfSmaltalk, (c) ObjectSpace.Net
Strona wygenerowana przy pomocy edytora aceHTML
i systemu VisualWorks Smalltalk NC 7.0