Ruby/Przedefiniowywanie metod: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Szymon wro (dyskusja | edycje)
Nie podano opisu zmian
Szymon wro (dyskusja | edycje)
Nie podano opisu zmian
Linia 3:
W podklasie możemy zmienić zachowanie instancji poprzez przedefiniowanie metod z nadklasy.
 
<source lang="ruby">
<pre>
ruby> class Czlowiek
| def przedstaw_sie
| puts "Jestem osoba."
| end
| def koszt_biletu(wiek)
| if wiek < 12
| puts "Oplata ulgowa.";
| else
| puts "Oplata normalna.";
| end
end
| end
 
| end
ruby> Czlowiek.new.przedstaw_sie #=> Jestem osoba.
nil
 
ruby> Czlowiek.new.przedstaw_sie
ruby> class Student1 < Czlowiek
Jestem osoba.
| def przedstaw_sie
nil
| puts "Jestem studentem."
ruby> class Student1 < Czlowiek
| end
| def przedstaw_sie
end
| puts "Jestem studentem."
 
| end
Student1.new.identify #=> Jestem studentem.
| end
</source>
nil
ruby> Student1.new.identify
Jestem studentem.
nil
</pre>
 
Przypuszczalnie moglibyśmy tylko ulepszyć metodę <tt>przedstaw_sie</tt> z nadklasy zamiast całkowicie ją podmieniać. Do tego celu możemy użyć słowa kluczowego <tt>super</tt>.
 
<source lang="ruby">
<pre>
ruby> class Student2 < Czlowiek
| def przedstaw_sie
| super
| puts "Jestem rowniez studentem."
| end
| end
 
nil
ruby> Student2.new.przedstaw_sie
#=> Jestem osoba.
# Jestem rowniez studentem.
</source>
nil
 
</pre>
<tt>super</tt> pozwala nam przekazywać argumenty do oryginalnej metody. Czasem mówi się, że ludzi dzielimy na dwa rodzaje ludzi...
 
<source lang="ruby">
ruby> class Nieuczciwy < Czlowiek
| def koszt_biletu(wiek)
| super(11) # chcemy skromna oplate
| end
end
 
ruby> Nieuczciwy.new.koszt_biletu(25) #=> Oplata ulgowa.
<tt>super</tt> pozwala nam przekazywać argumenty do oryginalnej metody. Czasem mówi się, że są dwa rodzaje ludzi...
 
ruby> class Uczciwy < Czlowiek
<pre>
| def koszt_biletu(wiek)
ruby> class Nieuczciwy < Czlowiek
| super(wiek) # przekazujemy argument ktory dostalismy
| def koszt_biletu(wiek)
| end
| super(11) # chcemy skromna oplate
| end
| end
nil
ruby> Nieuczciwy.new.koszt_biletu(25)
Oplata ulgowa.
nil
 
ruby> Uczciwy.new.koszt_biletu(25) #=> Oplata normalna.
ruby> class Uczciwy < Czlowiek
</source>
| def koszt_biletu(wiek)
| super(wiek) # przekazujemy argument ktory dostalismy
| end
| end
nil
ruby> Uczciwy.new.koszt_biletu(25)
Oplata normalna.
nil
</pre>
<noinclude>
{{ProstaNawigacja|spis=Ruby|poprzart=Ruby/Dziedziczenie|poprz=Dziedziczenie|nastart=Ruby/Kontrola dostępu|nast=Kontrola dostępu}}