Kalıtım (programlama): Revizyonlar arasındaki fark

Vikipedi, özgür ansiklopedi
[kontrol edilmiş revizyon][inceleme bekliyor]
İçerik silindi İçerik eklendi
Görsel öneri özelliği: 1 görsel eklendi.
Nataliemeoww (mesaj | katkılar)
İngilizce makaleden iki başlık genişletildi
1. satır: 1. satır:
{{Genişlet dil|langcode=en|otherarticle=Inheritance (object-oriented programming)}}
{{Genişlet dil|langcode=en|otherarticle=Inheritance (object-oriented programming)}}
[[Dosya:Herencia UML.PNG|küçükresim|Bir üst sınıftan türemiş alt sınıfın, kalıtım şeması.]]
[[Dosya:Herencia UML.PNG|küçükresim|Bir üst sınıftan türemiş alt sınıfın, kalıtım şeması.]]
'''Kalıtım''' ([[İngilizce|İng.]] ''inheritance''), bir [[sınıf (programlama)|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 [[Nesne (programlama)|nesne]]lerden faydalanılarak çoklu kalıtımın verdiği özellikler, yan etkileri olmaksızın kullanılabilmektedir.
'''Kalıtım''' ({{lang|en|inheritance}}), bir [[sınıf (programlama)|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 [[Nesne (programlama)|nesne]]lerden faydalanılarak çoklu kalıtımın verdiği özellikler, yan etkileri olmaksızın kullanılabilmektedir.
[[Çoklu kalıtım]]a izin veren [[Programlama dili|programlama dilleri]]ndeyse 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).
[[Çoklu kalıtım]]a izin veren [[Programlama dili|programlama dilleri]]ndeyse 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 ==

1996'da [[Tony Hoare]] [[bileşik (bilişim)|bileşik]]ler ü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ı.<ref>{{bilimsel rapor kaynağı |soyadı1=Hoare |ad1=C. A. R. |başlık=Record Handling |tarih=1966 |url=http://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-9-pdf/k-9-u2293-Record-Handling-Hoare.pdf|sayfalar=15-16}}</ref> 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.<ref>{{konferans kaynağı |ad1=Ole-Johan|soyadı1=Dahl|ad2=Kristen|soyadı2=Nygaard|başlık=Class and subclass declarations|yayıncı=Norwegian Computing Center|konferans=IFIP Working Conference on Simulation Languages|yer=Oslo|tarih=May 1967|url=https://www.ub.uio.no/fag/naturvitenskap-teknologi/informatikk/faglig/dns/dokumenter/classandsubclass1967.pdf}}</ref> Bir bileşik nesnenin nicelikleri nokta gösterimi ile erişilirdi. Bu fikir ilk [[Simula]] 67 programlama dilinde uygulanmıştı.<ref>{{kitap kaynağı |soyadı1=Dahl |ad1=Ole-Johan |bölüm=The Birth of Object Orientation: the Simula Languages |çalışma=From Object-Orientation to Formal Methods |seri=Lecture Notes in Computer Science |tarih=2004 |cilt=2635 |sayfalar=15–25 |doi=10.1007/978-3-540-39993-3_3 |isbn=978-3-540-21366-6 |bölüm-url=https://www.mn.uio.no/ifi/english/about/ole-johan-dahl/bibliography/the-birth-of-object-orientation-the-simula-languages.pdf}}</ref> Fikir sonrasında [[Smalltalk]], [[C++]], [[Java]], [[Python]], ve başka birçok dile yayıldı.

==Çeşitler==
[[File:Single Inheritance.jpg|thumb|upright|Tekli kalıtım]]
[[File:Multiple Inheritance.jpg|thumb|upright|Çoklu kalıtım]]

Paradigma ve dile göre farklı kalıtım çeşitleri bulunmaktadır.<ref>{{web kaynağı|url=https://www.cs.nmsu.edu/~rth/cs/cs177/map/inheritd.html|başlık=C++ Inheritance|websitesi=www.cs.nmsu.edu}}</ref>

;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.
:{{Quotation|Ç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.<ref>{{kitap kaynağı | başlık=The Design and Evolution of C++ |ad=Bjarne |soyadı=Stroustrup | yazarbağı=Bjarne Stroustrup| sayfa=417 |yayıncı=Pearson |tarih=1994 |isbn= 9780135229477}}</ref>|[[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.
:[[File:Multilevel Inheritance.jpg|thumb|right|upright|Ç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:
:<syntaxhighlight lang="cpp">
// 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
</syntaxhighlight>
: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''&apos;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.


{{bilgisayar-taslak}}
{{bilgisayar-taslak}}

Sayfanın 16.18, 24 Mart 2024 tarihindeki hâli

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

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

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.


  1. ^ Hoare, C. A. R. (1966). Record Handling (PDF). ss. 15-16. 
  2. ^ Dahl, Ole-Johan; Nygaard, Kristen (May 1967). Class and subclass declarations (PDF). IFIP Working Conference on Simulation Languages. Oslo: Norwegian Computing Center. 
  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. 
  5. ^ Stroustrup, Bjarne (1994). The Design and Evolution of C++. Pearson. s. 417. ISBN 9780135229477.