Witam,
Przeczesałem sieć w poszukiwaniu odpowiedzi na moje pytanie, nie mniej nie udało mi się rozwiązac problemu Może myslę zbyt “przylegle” do języka w którym aktualnie rzeźbie aplikacje. Kod poniżej wyrzuca błąd tuż po wywołaniu metody roar instancji klasy Dolphin. Co ciekawe(dla mnie bynajmniej ), błąd pojawia się po wcześniejszym wypluciu wyniku przez metodę rodzica :F
[code]class Animal
def roar
p 'Hi! I’m the ’ + self.class.to_s
end
end
class Dolphin < Animal
def roar
super.roar
p ‘I can swim very well ;)’
end
end
Dolphin.new.roar[/code]
Byłbym wdzięczny za jakiekolwiek wskazówki
tak więc, samo wywołanie ‘super’ wywołuje metodę roar z klasy animal, po czym zwraca nil, na którym próbujesz jeszcze wywołać metodę roar, czego sie nie da po prostu skasuj .roar
W Ruby super nie jest referencją do rodzica, dlatego w linijce super.roar
klasy Dolphin
otrzymujemy błąd : undefined method `roar’ for nil:NilClass (NoMethodError) Wystarczy użyć super bez argumentów, aby przesłać komunikat do rodzica “wywołaj swoja metode roar” Więc klasa Dolphin powinna wyglądć tak:
class Dolphin < Animal
def roar
super
p 'I can swim very well ;)'
end
end
Ok, już rozumiem Dziękuje za pomoc. Mam jeszcze jedno pytano związane z tym tematem, które wynika bezpośrednio z Waszych odpowiedzi - czy istnieje możliwość wywołania przesłoniętej metody rodzica, będąc aktualnie w innej metodzie instacji dziecka. Przykład poniżej:
[code]class Animal
def roar
p 'Hi! I’m the ’ + self.class.to_s
end
def sniff
p 'nuff nuff'
end
end
class Dolphin < Animal
def roar
super
p ‘I can swim very well ;)’
# jak wywołać metodę sniff rodzica?
end
Nie możesz. I choć może to wydawać się ograniczeniem to próba takiego wywołania prawdopodobnie świadczy o błędzie programisty. Skoro metoda została przesłonięta w podklasie tzn, że “stara” metoda nie umie poprawnie obsłużyć obiektu podklasy.