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.