Previous
Next

JAVA - Multiple Inheritance (Çoklu Kalıtım)

by Cem Kefeli 30. Ekim 2012 05:39

Daha önce Inheritance(Kalıtım) nedir?Diamond Problem of Multiple Inheritance adresindeki yazımda ve Interfaces(Arayüzler) adresindeki yazımda 'Kalıtım' ve 'Arayüzler' konularından bahsetmiştim. Çoklu kalıtım (Multiple Inheritance) diyorsak arayüzlerden bahsetmemek olmaz tabi. Kalıtım olmadan da 'çoklu' su olmayacağına göre eğer eksikler varsa ilk önce bu iki yazıyı okumanızı öneririm.

Gelelim asıl konuya, Java'da çoklu kalıtım mevzusuna. Aslında daha uzatmadan Java'da çoklu kalıtım yoktur deyip yazıyı bitirebiliriz ama gelin bakalım neden yoktur. Var olanlarda neden ve nasıl vardır?

Sol tarafta bu konu ile ilgili basit ama güzel bir UML diagram var. Class B ve Class C, Class A'dan türeyen yavru sınıflar. Türemenin doğal özelliğini kullanarak doWork isimli metodu da overwrite etmişler. Ne kadar güzel! İşte kalıtım... Fakat bir de Class D var... Olmaz ama diyelim ki Class D öyle birşey yapmış ki hem Class B'den hem de Class C'den türemiş. Yani çoklu kalıtım uygulanmış, türedikten sonra bir de üstüne üstlük doWork method'unu override etmemiş, ki etme zorunluluğu da yok burada. Şimdi ne olacak? doWork methodu son durumda nasıl oluşur? Class B'deki gibi mi yoksa Class C'deki gibi mi? İşte bu bir paradoks, kalıtımda diamond problemi olarak isimlendiriliyor.

C++'da bu işler oluyor ama hangi sınıfın hangi method'unu çağırmak istediğinizi bizzat kendiniz vermeniz gerekmekte. C++ çoklu kalıtıma bu şekilde bir çözüm bulmuş.

C++ Multiple Inheritance  |  Gizle  |  Göster
#include 
using std::cout;
using std::endl;

class ClassA { public: virtual void print() const = 0; // pure virtual }; class ClassB : public ClassA { public: void print() const { cout << "ClassB\n"; } }; class ClassC : public ClassA { public: void print() const { cout << "ClassC\n"; } }; class ClassD : public ClassB , public ClassC { public: void print() const { ClassB::print(); } }; int main() { ClassD Class_D; ClassB Class_B; ClassC Class_C; ClassA *array[3]; array[0] = &Class_D; // ERROR array[1] = &Class_B; array[2] = &Class_C; for( int i=0 ; i<3 ; i++ ) array[i] -> print(); return 0; }

Tekrar Java'ya geri dönecek olursak. C++'da var da neden Java'da bu iş yok diye düşünebilirsiniz ama bu tamamen dilin dizayn aşaması ile ilgili bir durum. Çok kullanılmaması ve yanlış sonuçlara yol açabilmesi, ayrıca tam anlamıyla hiçbir zaman çoklu kalıtım diye birşeyin olmayacak olması Java'yı geliştirenleri böyle bir duruma yöneltmiş. Sonuç olarak Java'da çoklu kalıtımı bir nebze olsun arayüzler ile sağlayabiliyoruz.

Yorumlar (2) -

Binnur Kurt
Binnur Kurt Turkey
25.06.2013 06:59:38 #

Java'da çoklu kalıtım var, ama interface'ler arasında. Bir interface birden fazla interface'i extend edebilir.
Üstelik bir sınıf bir tek sınıfı extend edebilirken birden fazla interface'i implement edebilir. interface'ler arasında çoklu kalıtımın C++'daki çoklu kalıtımda ortaya çıkan problemi yaratmamasının sebebi interface'lerin verisinin olamamasıdır. En fazla static final tanımlı sabit tanımlayabilirsiniz.  C++'daki çoklu kalıtım problemi daha çok verilerin tekrarlı olarak ebeveyn sınıftan gelmesiyle ilgilidir. Bu problemi bir ölçüde "virtual inheritance"  ile çözüyoruz. Ama bu çözüm fazla sezgisel olması nedeni ile tam bir çözüm olarak kabul edilmiyor. Ayrıca çözemediği bazı durumlar da bulunuyor.

Yanıtla

admin
admin Turkey
01.07.2013 03:59:37 #

Selam hocam, değerli yorumların için teşekkür ederim.

Cem

Yanıtla

Yorum ekle

biuquote
  • Yorum
  • Canlı önizleme
Loading

Hakkımda...

Cem KEFELİ

Electronics and
Telecommunication Eng.
devamı...


Son yapılan yorumlar...

Comment RSS

Yasal bir uyarı...

Disclaimer"Bu web sitesinde görmüş olduğunuz bilgilerin, dokümanların ve diğer materyallerin kullanılmasından doğabilecek hiç bir sorumluluktan site sahibi sorumlu tutulamaz. Web sitesi içerisinde yer alan yazılar, yorumlar, resimler ve diğer tüm içerikler yalnızca sahibinin görüşünü yansıtmakta olup içeriğin sahibi kişilerin çalıştığı kurumları bağlayıcı hiç bir nitelik taşımamaktadır. Yapılan tüm alıntılar mutlaka kaynak gösterilerek verilmeye çalışılmaktadır. Web sitesi içerisinde bulunan ilgili materyaller, ilgili yasal kurumlar tarafından uygun görülmemesi durumda kaldırılacaktır."
General