"Enter"a basıp içeriğe geçin

Kalıtım

Kalıtım Nedir

Kalıtım, Nesneye yönelik programlamanın en önemli kısımlarından biridir. Bir sınıftan, o sınıfın özelliklerine sahip istediğimiz kadar sınıf üretmemize yarar.
Öncelikle kalıtımı neden kullandığımızı bir örnek ile anlatalım.

Üçgen ve Dörtgen şekillerimiz olsun. Bu iki sınıfta da belli başlı ortak özellikler vardır. İkisinin de kenarları vardır. köşeleri vardır. Çevre uzunluğu vardır. Alanı vardır. Yani aslında ikisi de bir geometrik şekildir ve çoğu özelliği aynı olmakla beraber birbirinden farklı özellikleri de vardır.

Eğer biz bu iki sınıfı yazmak istersek, neredeyse aynı kodu tekrar yazmış oluruz. Eğer bide beşgen eklemek istersek onun için de aynı kodları yazarız. Yada eşkenar üçgen diye ayrı bir sınıf üretmek isteyebiliriz.
Sonuç olarak çok fazla kod tekrarı olur. Kopyala yapıştır yaparsak da karmaşayı arttırır. Eğer bir hata varsa hepsinde tek tek düzeltmemiz gerekir. Yada yeni bir özellik eklemek istediğimizde (ör. renk) tekrar tüm sınıflar için uğraşmamız gerekir. Sınıf sayısı arttıkça bu dezavantajı daha çok hissederiz.

Bütün bunlar gereksiz zaman kaybına yol açar. Bunun yerine şöyle bir mantık kullanabiliriz.

Aslında bunların hepsi birer geometrik şekildir. Geometrik şekiller  diye bir sınıf oluştururuz. Bu sınıfa bir geometrik şekilde olabilecek tüm özellikleri ekleriz. (kenar-köşe sayısı, çevre uzunluğu,yükseklik, alan, iç açılar toplamı vb), daha sonra bu özellikleri aynen alan sınıflar oluşturup, o sınıf özelinde gereken özellikleri tekrar yazarız. (üçgen için kenar sayısı 3, dörtgen için 4, ama ikisinde de dış açılar toplamı 360 olduğundan değiştirmeye gerek yok)

Bu özellikleri kendi kendine aldığı için de,  asıl sınıfı (geometrik şekil) bir kere yazarız, değişiklik yapıldığında da tümünü etkiler. Daha sonra bu üçgen sınıfının da tüm özelliklerini alarak eşkenar üçgen, ikizkenar üçgen vb de üretebiliriz. Bu şekilde istediğimiz kadar sınıfı daha az zahmetle üretebiliriz.
İşte bu kalıtımdır. Aslında olmazsa olmaz değildir. Hepsini tek tek yazmak da mümkündür. Ancak eğer kalıtımı doğru kullanırsak, kod yazma zamanında ve bakım maliyetinde büyük tasarruf elde ederiz.

Ayrıca kalıtımdan bahsederken bilmemiz gereken bir kavram daha vardır. Şimdiye kadar sınıflarımızda private ve public bölümleri vardı. Public kısımdaki üye değişkenler ve fonksiyonlar her yerden erişilebilirken, private kısımdakiler sadece o sınıfın içinden erişilebiliyordu. Kalıtım konusunda 3. bir belirteçten bahsedeceğiz yani protected.

Protected Kavramı

Private üyelerin bakşa yerde kullanılamaması kalıtım için de geçerlidir. Yani ata sınıftaki private üyeler çocuk sınıfa gidemez. Böyle bir durumda protected kelimesini kullanırız. Protected kısma yazılan üyeler aslında private gibi davranır. Tek farkları kalıtım yoluyla alt sınıflara ulaşabilmesidir.

Eğer … bir … dır diyebiliyorsak burda kalıtım kullanmamız gerekir. Üçgen bir geometrik şekildir diyebiliyoruz. Geometrik şekil sınıfı, üçgen sınıfının atasıdır. Burada kalıtım uygulayabiliriz. Aynı şekilde eşkenar üçgen bir üçgendir de diyebiliyoruz. Bu da kalıtım olabilir. Doğal olarak Eşkenar üçgen bir geometrik şekildir. Geometrik şekil sınıfı eşkenar üçgen sınıfının doğrudan olmasa da uzak atasıdır. Yani dolaylı kalıtım vardır. Ayrıca bir sınıf birden çok atadan da türeyebilir. Buna çoklu kalıtım (multiple inheritance) denir. (bir atadan birden çok sınıf türetilmesi multiple inheritance değildir)

Bu konuyu sahiplik ile karıştırmamak gerekir. Mesela daha önce iç içe sınıflar kullanmıştık. Mesela motor örneği vermiştik. Araba sınıfımız motor sınıfına sahiptir. Ama bu kalıtım değildir. Çünkü araba bir motordur diyemeyiz. Motor, arabanın bir parçasıdır. Bu bir sınıfın başka sınıflardan oluşmasıdır. Kalıtımda ise, bir sınıf başka bir sınıfın özelleşmiş halidir.

Ata sınıfta olan fonksiyonların çocuk sınıfa aynen geçtiğini gördük. Peki aynı sınıfı çocuk sınıfta tekrar tanımlarsak ne olur buna bakalım

Görüldüğü gibi kare sınıfı dikdörtgenin alt sınıfı. Dikdörtgene ait tüm fonksiyonlar kareye de geliyor. Ancak print fonksiyonu  tekrardan tanımlandığı için ata sınıftan geleni baskılıyor

 

Bu aslında sonraki  konumuz olan çok biçimlilikle alakalı. Bunun detayını orada göreceğiz

Sonuç olarak, bir ana sınıfımız var ve bunların özelleşmiş halleri var ise burada kalıtım vardır. Kalıtım olmadan da kod yazabiliriz ancak bu hem yazma hem bakım maliyetini etkiler. Bu yüzden kalıtım, nesneye yönelik programlamanın en önemli ayaklarından biridir.

    Bir cevap yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir