Ruby/Dziedziczenie: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Szymon wro (dyskusja | edycje)
Nie podano opisu zmian
Szymon wro (dyskusja | edycje)
Linia 5:
Możemy wyrazić tę koncepcję w Rubim:
 
<source lang="ruby">
<pre>
ruby> class Ssak
| def oddychaj
| puts "wdech i wydech"
| end
| end
 
nil
ruby> class Kot < Ssak
| def daj_glos
| puts "Miau"
| end
| end
</source>
nil
</pre>
 
Chociaż nie określamy jak <tt>Kot</tt> powinien oddychać, to każdy kot będzie dziedziczył to zachowanie z klasy <tt>Ssak</tt> ponieważ <tt>Kot</tt> został zdefiniowany jako podklasa klasy <tt>Ssak</tt>. (W terminologii obiektowej, mniejsza klasa jest ''podklasą'', natomiast większa klasa jest ''nadklasą''.) Odtąd, z punktu widzenia programisty, koty uzyskują zdolność oddychania "za darmo". Jak dodamy metodę <tt>daj_glos</tt> nasze koty będą mogły zarówno oddychać oraz mówić.
 
<source lang="ruby">
<pre>
ruby> mruczek = Kot.new
mruczek.oddychaj #=> wdech i wydech
#<Kot:0xbd80e8>
ruby> mruczek.oddychajdaj_glos #=> Miau
</source>
wdech i wydech
nil
ruby> mruczek.daj_glos
Miau
nil
</pre>
 
Na pewno wystąpią również takie sytuacje, że niektóre własności nadklasy nie powinny być dziedziczone przez jakąś konkretną podklasę. Chociaż ptaki generalnie potrafią latać, pingwiny są podklasą ptaków nielotnych ([[w:Nielot|nielotów]]).
 
<source lang="ruby">
<pre>
ruby> class Ptak
| def czysc
| puts "Czyszcze piorka."
| end
|
def lataj
| puts "Latam."
| end
| end
 
nil
ruby> class Pingwin < Ptak
| def lataj
| fail "Przykro mi. Raczej poplywam."
| end
| end
</source>
nil
</pre>
 
Zamiast kompletnie definiować każdą cechę każdej nowej klasy, potrzebujemy jedynie dołączyć, a raczej przedefiniować różnice pomiędzy każdą podklasą a jej nadklasą. Takie użycie dziedziczenia jest czasem nazywane ''programowaniem różnicowym''. Jest to jedna z zalet programowania zorientowanego obiektowo.