İçeriğe atla

Kalıtım (programlama)

Vikipedi, özgür ansiklopedi
Bir üst sınıftan türemiş alt sınıfın, kalıtım şeması.

Kalıtım (İngilizceinheritance), bir sınıfın üst sınıftan miras almasına denir. Pratikte karışıklıklara sebep olduğundan kimi programlama dilleri, ancak tekli kalıtıma izin verirler (Java gibi). Bu dillerde çoklu kalıtım yerine interface denilen nesnelerden faydalanılarak çoklu kalıtımın verdiği özellikler, yan etkileri olmaksızın kullanılabilmektedir. Çoklu kalıtıma izin veren programlama dillerindeyse doğrudan bir sınıfın birden fazla sınıftan miras alması mümkündür. (C++ ve C# gibi dillerde olduğu gibi).

Tarihçe[değiştir | kaynağı değiştir]

1996'da Tony Hoare bileşikler üzerine birkaç görüş ortaya koydu ve özellikle de bileşik alt sınıflarına dair fikrini meydana attı. Bunları ortak nicelikleri olan fakat bir değişke etiketi ile ayırt edilen ve değişkelere özel nicelikler de içeren birer bileşik olarak tanımladı.[1] Bundan esinlenerek, 1967'da Ole-Johan Dahl ve Kristen Nygaard farklı sınıflara mensup fakat farklı niceliklere sahip nesneler tanımlamaya yol açan bir tasarım ortaya koydu. Ortak nicelikler bir üst sınıfta toplanmakta ve üst sınıflar ise kendileri birer üst sınıfa mensup olabilmekteydi. Bu halde, bir alt sınıfın değerleri farklı üst sınıflara ait herhangi bir sayıda ön kısım ve alt sınıfa ait bir ana kısım içeren birer bileşik nesneydi. Bu kısımlar birleştirilmekteydi.[2] Bir bileşik nesnenin nicelikleri nokta gösterimi ile erişilirdi. Bu fikir ilk Simula 67 programlama dilinde uygulanmıştı.[3] Fikir sonrasında Smalltalk, C++, Java, Python ve başka birçok dile yayıldı.

Çeşitler[değiştir | kaynağı değiştir]

Tekli kalıtım
Çoklu kalıtım

Paradigma ve dile göre farklı kalıtım çeşitleri bulunmaktadır.[4]

Tekli kalıtım
Alt sınıflar tek bir üst sınıfın özelliklerini miras alır. Bir sınıf başka bir sınıfın özelliklerine sahip olur.
Çoklu kalıtım
Tek bir sınıf birden fazla üst sınıfa sahip olabilip tüm üst sınıflarından özellik miras alır.

Çoklu kalıtımı verimli bir şekilde programlaması çok zor olarak görülüyordu. Mesela, Objective-C üzerine kitabında, Brad Cox gerçekten C++'a çoklu kalıtım eklemenin imkansız olduğunu öne sürdü. 1982 kadar erken bir vakitte çoklu kalıtımı düşünüp 1984'te basit ve verimli bir programlama tekniği bulduğum için bu zorluğu üstüme aldım. Zannediyorum ki bu modanın olay örgüsünü değiştirdiği tek durum.[5]

Bjarne Stroustrup

Çok seviyeli kalıtım
Alt sınıflar başka bir alt sınıfa/alt sınıflara mensup olabilir. "Çok seviyeli kalıtım" şeklinde gösterildiği halde bu durum epey yaygındır.
Çok seviyeli kalıtım
A sınıfı B türetilmiş sınıfı için bir taban sınıfı görevi görür, ki o da C türetilmiş sınıfı için bir taban sınıfı görevi görür. B sınıfı bu durumda A ve C arasındaki kalıtım için bir aracı olduğundan dolayı ortanca taban sınıfı olarak bilinir. ABC zinciri kalıtım yolu olarak bilinir.
Çok seviyeli kalıtım ile türetilmiş sınıflar aşağıdaki gibi tanımlanır:
// C++ dilinde emplementasyon
class A { /* ... */ };      // Taban sınıfı
class B : public A { /* ... */ };   // A'dan türetilmiş B
class C : public B { /* ... */ };   // B'den türetilmiş C
Bu işlem herhangi bir seviye derinliğine sürdürülebilir.
Hiyerarşik kalıtım
Bu durumda tek bir sınıf birden fazla sınıfa üst sınıflık eder. Mesela, bir üst sınıf, A, B ve C olmak üzere iki alt sınıfa sahip olabilir. Hem B hem de C'nin üst sınıfı A olsa da B ve C farklı birer sınıftır.
Karma kalıtım
Karma kalıtım, yukarıdaki çeşitlerden iki ya da ikiden fazlası gerçekleşmesidir. Bunun bir örneği bir A sınıfının iki C ve D olmak üzere iki alt sınıfa sahip bir B alt sınıfına sahip olmasıdır. Bu, çok seviyeli ve hiyerarşik kalıtımın bir karışımıdır.

Kaynakça[değiştir | kaynağı değiştir]

  1. ^ Hoare, C. A. R. (1966). Record Handling (PDF). ss. 15-16. 7 Nisan 2022 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 24 Mart 2024. 
  2. ^ Dahl, Ole-Johan; Nygaard, Kristen (May 1967). Class and subclass declarations (PDF). IFIP Working Conference on Simulation Languages. Oslo: Norwegian Computing Center. 16 Mayıs 2023 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 24 Mart 2024. 
  3. ^ Dahl, Ole-Johan (2004). "The Birth of Object Orientation: the Simula Languages" (PDF). From Object-Orientation to Formal Methods. Lecture Notes in Computer Science. 2635. ss. 15-25. doi:10.1007/978-3-540-39993-3_3. ISBN 978-3-540-21366-6.  Eksik ya da boş |başlık= (yardım)
  4. ^ "C++ Inheritance". www.cs.nmsu.edu. 24 Eylül 2023 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Mart 2024. 
  5. ^ Stroustrup, Bjarne (1994). The Design and Evolution of C++. Pearson. s. 417. ISBN 9780135229477.