şükela:  tümü | bugün
  • "deadly diamond of death" de denilen yazılım mimarisinden kayaklanan "object oriented programming" ile ilgili bir problemdir. mesela doğadaki hayvanları ifade eden "hayvanlar alemi" diye bir sınıfımız olsun. bu "hayvanlar alemi" sınıfının altında bundan kalıtım yoluyla türetilmiş "kedi" ve "köpek" diye iki sınıfımız daha olsun. örneğimizde "hayvanlar alemi" sınıfına "yemekye()" diye bir metod oluşturalım. "kedi" sınıfının kendine has yemek yeme özelliği vardır. bu nedenle "hayvanlar alemi" sınıfının "yemekye()" metodunu "override" yaparak kendine has yemek yeme metodunu oluşturuyoruz. ayni şekilde "köpek" sınıfının da kendine has yemek yeme özelliği vardır. bunun için de "hayvanlar alemi" sınıfının "yemekye()" metodunu "override" ediyoruz. buraya kadar her şey yolunda gidiyor. kedi kendisine has yemek yeme özelliğine sahip, köpek de kendisine has yemek yeme özelliğine sahip. bunun dışında tüm hayvanların da yemek yeme özelliği kalıtım yoluyla diğer hayvan türlerine aktarılmak üzere mevcut duruyor. fakat ileride evde beslemek üzere "evhayvanlari" adında bir sınıf daha yaratırsak ne olur? elbette tüm hayvanlar ev hayvanı değildir o nedenle "evhayvanlari" sınıfını "hayvanlar alemi" sınıfından değil de "kedi" ve "köpek" sınıflarından kalıtım yoluyla türetmemiz gerekecek. bunu türettikten sonra ev hayvanlarına "yemekye()" metodunu oluşturmamız gerekecek çünkü ev hayvanları, mesela kedi doğada yasayan vahşi hemcinslerinden farklı yemek yeme davranışına sahip. ayni şekilde köpek de. simdi bizim bu "evhayvanlari" iki sınıftan türetildi bunlar "kedi" ve "köpek", ikisi de "yemekye()" metoduna sahip. eğer ev hayvanımıza yemek ye dersek bu ev hayvani kedi gibi yemek ye metodunu mu çalıştıracak yoksa köpek gibi mi? bu bir cikmaz, "hayvanlaralemi" sinifindan cikan iki dal "kedi" ve "köpek" diye ayrildi ama tekrar bu dallar "evhayvanlari" sinifinda birlesti, tipki bir baklava dilimi sekli gibi <> yada elmas (diamond) sekli gibi birlesti. bu durum özel olarak cözüm üretilmesi gereken bir problem.

    işte bu problemle karşılaşmamak için java dili iki ayrı sınıftan kalıtım almayı engellemiştir yani java dilinde "multiple inheritance" yoktur. ta ki "java 8"'e kadar. java 8 de "interface"ler de "uygulanmış" yani kod barındıran metodlar barındırabilir. elbet javada "extends" anahtar kelimesi ile sadece bir sınıftan inheritance yapabiliyoruz. ama bu interface kullanımında böyle değildir, bir sınıf birçok "interface"'i "implements" anahtar kelimesi ile uygulayabilir. java 8 e kadar "interface"'ler metod barındırmadığı için bir mimari sözleşme veya yaptırım olarak görev almış fakat java 8 de "interface"'ler metod barındırabilmesi ile işlevsellik kazanmıştır. bu da "diamond problem" başka bir deyişle "deadly diamond of death" problemini oluşturulabilir kılmıştır.
3 entry daha