Az çok Java programlama dili ile kod yazmış herkesin bildiği üzere Java programlama dili çoklu kalıtıma yani bir sınıfın birden fazla sınıfı kalıtmasına izin vermez. Peki bunun altında yatan sebep nedir?

Herşeyden önce bu durum Java dilini yazan kişilerin karar verdiği bir tasarım prensibi. C++ ve bazı diğer programlama dilleri çoklu kalıtıma izin veren bir yapıda iken Java’nın geliştiricileri çoklu kalıtımı dile dahil etmemişler.

Çoklu kalıtımın Java dilinde kullanılamaması da aslında The Diamond Problem adı verilen bir soruna dayanıyor. Bu sorunu da size şöyle izah edeyim:

En başta bizim A isminde bir sınıfımız var ve bu sınıf içinde writeToFile adında bir metodumuz olsun. B ve C ismindeki iki sınıf bu A sınıfını kalıtıyorlar ve A sınıfı içindeki writeToFile metodunu override ediyorlar. Buraya kadar bir sıkıntı yok. En altta gördüğümüz D ismindeki sınıf ise hem B hem de C’yi kalıtan bir sınıf. Bu D sınıfı eğer A’dan alınıp B ve C içinde override edilmiş olan writeToFile metodunu kendi içinde override etmez ise hangi writeToFile metodunu kullanacak? İşte The Diamond Problem ya da diğer bir adı ile Deadly Diamond of Death problemi girilen bu çıkmazı tarif eden bir problemdir.

The Diamond Problem’i kati olarak engellemek isteyen Java geliştiricileri bu sebepten ötürü Java’da çoklu kalıtıma izin veren bir yapıyı dile koymamışlar ve bu problemin oluşmasının önüne geçmişlerdir.

Java 8 Neyi Değiştirdi? 🙂

Java 8 ile birlikte başkalaşım geçiren dile interface’ler içerisinde body’si olan metotlar yazabilme özelliği getirildi. Pratikte yine bir sınıf 2 sınıfı kalıtamıyor fakat bir sınıf birden fazla interface’i implement edebilir ve bu interface’ler aynı metoda sahip olabilirler. Bu teorik olarak The Diamond Problem’in dile girmiş olduğu manasına geliyor fakat dilin geliştiricileri buna karşı bir önlem almışlar. Eğer bu interfaceler içerisinde gövdesi yazılmış aynı metotları barındırıyor ise ve bir sınıf bu 2 interface’i birden implement etmiş ise bu durumda yazılımcıdan iki interfacede de tanımlı olan, gövdesi oluşturulmuş o metodu sınıf içerisinde override etmesini ve bu override işleminden sonra hangi interface içindeki metot kullanılcaksa onun çağırılması isteniyor. Metot override edilmediği takdirde compile time exception verilerek kod hiç derlenmiyor.

Bu yazıda anlatacaklarım da bu kadar arkadaşlar. Başka bir yazıda görüşene kadar sağlıcakla kalın.

Selam ve Sevgilerimle