Ruby/Dziedziczenie: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
m +nav |
Szymon wro (dyskusja | edycje) Nie podano opisu zmian |
||
Linia 1:
==Dziedziczenie==
Klasyfikacja obiektów w codziennym życiu jest ze swojej natury hierarchiczna. Wiemy, że ''wszystkie koty są ssakami'', a ''wszystkie ssaki są zwierzętami''. Mniejsze klasy ''dziedziczą'' cechy charakterystyczne po większych, do których należą. Jeżeli wszystkie ssaki oddychają, to wszystkie koty również oddychają.
Możemy wyrazić tę koncepcję w Rubim:
<pre>
ruby> class Mammal
| def breathe
Linia 15 ⟶ 18:
| end
nil
</pre>
Chociaż nie określamy jak <tt>Cat</tt>(kot) powinien oddychać, to każdy kot będzie dziedziczył to zachowanie z klasy <tt>Mammal</tt>(ssak) ponieważ <tt>Cat</tt> został zdefiniowany jako podklasa klasy <tt>Mammal</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>speak</tt> nasze koty będą mogły zarówno oddychać oraz mówić.
<pre>
ruby> tama = Cat.new
#<Cat:0xbd80e8>
Linia 26 ⟶ 31:
Meow
nil
</pre>
Wystąpią takie sytuacje, że pewne 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]]).
<pre>
ruby> class Bird
| def preen
Linia 44 ⟶ 51:
| end
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.
<noinclude>
{{ProstaNawigacja|spis=Ruby|poprzart=Ruby/Klasy|poprz=Klasy|nastart=Ruby/Redefinicja metod|nast=Redefinicja metod}}
|