Ruby/Dziedziczenie
Z Wikibooks, biblioteki wolnych podręczników.
[edytuj] 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 również wszystkie koty oddychają.
Możemy wyrazić tę koncepcję w Rubim:
class Ssak def oddychaj puts "wdech i wydech" end end class Kot < Ssak def daj_glos puts "Miau" end end
Chociaż nie określamy jak Kot powinien oddychać, to każdy kot będzie dziedziczył to zachowanie z klasy Ssak ponieważ Kot został zdefiniowany jako podklasa klasy Ssak. (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ę daj_glos nasze koty będą mogły zarówno oddychać oraz mówić.
mruczek = Kot.new mruczek.oddychaj #=> wdech i wydech mruczek.daj_glos #=> Miau
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 (nielotów).
class Ptak def czysc puts "Czyszcze piorka." end def lataj puts "Latam." end end class Pingwin < Ptak def lataj fail "Przykro mi. Raczej poplywam." end end
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.