Her zaman bir dilde çoklu miras alma fikrini sevdim. Çoğu zaman kasıtlı olarak affedilmiş olmasına rağmen ve sözde "değiştirme" arayüzlerdir. Arayüzler, çoklu kalıtımın aynı toprakları kapsamaz ve bu kısıtlama zaman zaman daha fazla kazan koduna yol açabilir.
Bunun için duyduğum tek temel sebep , temel sınıflardaki elmas problemi . Bunu kabullenemiyorum. Bana göre, "Şey, bunu mahvetmek mümkün , bu yüzden otomatik olarak kötü bir fikir." Her şeye rağmen bir programlama dilinde herhangi bir şeyi mahvedebilirsiniz, ve ben bir şey demek istiyorum. Bunu ciddiye alamam, en azından daha ayrıntılı bir açıklama yapmadan.
Sadece bu sorunun farkında olmak savaşın% 90'ı. Dahası, yıllar önce bir "zarf" algoritması ya da bunun gibi bir şey içeren genel amaçlı bir çalışma hakkında bir şeyler duyduğumu düşünüyorum.
Elmas sorunuyla ilgili olarak, düşünebildiğim tek gerçek sorun, üçüncü taraf bir kütüphane kullanmaya çalışıyorsanız ve bu kitaplıktaki görünüşte alakasız iki sınıfın ortak bir temel sınıfa sahip olduğunu göremiyorsanız, buna ek olarak Basit bir dil özelliği olan dokümantasyon, diyelim ki, sizin için bir tane derlemeden önce bir elmas oluşturma niyetinizi özellikle beyan etmenizi gerektirebilir. Böyle bir özelliğe sahip olarak, herhangi bir elmasın yaratılması ya kasıtlıdır, umursamazdır ya da kişi bu tuzaktan habersizdir.
Böylece herkes söyleniyor ... Çoğu insanın birden fazla mirastan nefret etmesinin gerçek bir nedeni var mı , yoksa hepsi iyiden daha çok zarara neden olan bir demet histeri mi? Burada görmediğim bir şey var mı? Teşekkür ederim.
Örnek
Araba WheeledVehicle'ı uzatır, KIASpectra Araba ve Elektronik'i uzatır, KIASpectra Radyo'yu içerir. KIASpectra neden Elektronik içermiyor?
Bunun Çünkü olduğunu Elektronik. Kalıtım - kompozisyon, her zaman bir ilişki-bir ilişki-ilişki olmalıdır.
Bunun Çünkü olduğunu Elektronik. Teller, devre kartları, anahtarlar, vb. Hepsi yukarı ve aşağı vardır.
Bunun Çünkü olduğunu Elektronik. Bataryanız kışın tükenirse, tüm tekerlekleriniz bir anda kayboluyormuş gibi sorun yaşarsınız.
Neden arayüzleri kullanmıyorsunuz? Mesela # 3 atın. Bunu tekrar tekrar yazmak istemiyorum ve gerçekten de bunu yapmak için tuhaf bir proxy yardımcı sınıfı oluşturmak istemiyorum:
private void runOrDont()
{
if (this.battery)
{
if (this.battery.working && this.switchedOn)
{
this.run();
return;
}
}
this.dontRun();
}
(Uygulamanın iyi ya da kötü olup olmadığına girmiyoruz.) WheeledVehicle'daki herhangi bir şeyle ilgili olmayan, Elektronikle ilgili bu işlevlerden birkaçının nasıl olabileceğini hayal edebilirsiniz .
Bu örneğe karar verip vermeyeceğime emin değildim, çünkü orada yorumlamaya yer var. Uçak Uzatmalı Araç ve FlyingObject ve Kuş ve Hayvan ve FlyingObject'i uzatan kuş açısından veya daha saf bir örnek olarak düşünebilirsiniz.
Traits
- isteğe bağlı uygulamalarla ara yüz gibi davranırlar, ancak elmas sorunu gibi sorunların ortaya çıkmasını önlemeye yardımcı olacak bazı kısıtlamaları vardır.
KiaSpectra
değildir bir Electronic
; o vardır Elektronik ve bir olabilir ElectronicCar
(uzanacak Car
...)