Ruby/Dziedziczenie
Dziedziczenie
[edytuj]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.