13. Kalıtım

Gerçek hayatta yaptığımız sınıflandırmalar son derece hiyerarşiktir. Örneğin bütün kedilerin memeli olduğunu ve bütün memelilerin hayvan olduğunu biliriz. Küçük sınıflar mensup oldukları büyük sınıfların karakteristik özelliklerini miras alırlar. Eğer bütün memeliler nefes alabiliyorsa, bütün kediler de nefes alabiliyor demektir.

Bu durumu Ruby'de aşağıdaki gibi açıklayabiliriz:

ruby> class Memeli
    |    def nefeslen
    |       print "nefes al, nefes ver\n"
    |    end
    |  end
   :nefeslen
ruby> class Kedi < Memeli
    |    def konuş
    |       print "Miyauvvvv\n"
    |    end
    |  end
   :konuş

Örneğin bir Kedi'nin nasıl nefes alması gerektiğini belirtmediğimizi farz edelim. Bu durumda her kedi Kedi sınıfı Memeli sınıfının bir alt sınıfı olarak tanımlanmışsa, bu davranışı Memeli sınıfından miras olarak alacaktır. (Nesneye yönelik terminolojide küçük sınıf alt sınıf , büyük sınıfsa süper sınıf olarak isimlendirilir.) Yazılımcının bakış açısına göre, kediler nefes alma yeteneğini bağımsız olarak almıştır, eğer bir konuş yöntemi de eklersek, artık kedilerimiz hem nefes alabilme hem de konuşabilme yeteneğine sahip olur.

ruby> pisi = Kedi.new
   #<Kedi:0x0000558744912cd0>
ruby> pisi.nefeslen
nefes al, nefes ver
   nil
ruby>  pisi.konuş
Miyauvvvv
   nil

Bazen süper sınıfta olması gereken ancak alt sınıf tarafından miras alınması istenmeyen bir özellik olabilir. Örneğin genel olarak kuşların uçmayı bildiğini ancak penguenlerin, kuşların uçamayan bir alt sınıfı olduğunu kabul edelim.

ruby> class Kuş
    |    def gagala
    |       print "Tüylerimi temizliyorum.\n"
    |    end
    |    def uç
    |       print "Uçuyorum.\n"
    |    end
    | end
   :uç
ruby> class Penguen < Kuş
    |    def uç
    |       fail "Üzgünüm, yüzmeyi tercih ederim.\n"
    |    end
    | end
   :uç

Her yeni sınıfın her özelliğini ayrı ayrı tanımlamak yerine, sadece her alt sınıfla onun süper sınıfı arasındaki farklılıkları eklemek ya da yaniden tanımlamak daha iyidir. Kalıtımın bu kullanımına bazen farksal yazılım geliştirme denir. Bu nesneye yönelik yazılım geliştirmenin en yararlı özelliklerinden biridir.