Błąd wywołania metody rodzica

Witam,
Przeczesałem sieć w poszukiwaniu odpowiedzi na moje pytanie, nie mniej nie udało mi się rozwiązac problemu :confused: 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 :wink: ), 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 :slight_smile:

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 :slight_smile: 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” :slight_smile: 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 :slight_smile: 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

def sniff
	p 'I can\'t sniff...'
end

end

Dolphin.new.roar[/code]

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.