C # neden birden fazla kalıtım desteklemiyor?


10

Kötü uygulamalar olsa bile, amacını yerine getirmesi için zaman olduğunu söyleyebilirim.


1
Microsoft'un ürettiği her şeyde tamamen yararlı bir yetenek olmaması için herkesin tüm bu mazeretleri nasıl yaptığını seviyorum (MVP'ler özellikle bu konuda beceriklidir). Benim tahminim, çoklu mirasın faydalarını anlamayan halkın çoğunun, mirasını ilk başta anlamayan (ve kullanmayan) olanlar olduğu için, her zaman popüler olan kopyala ve hemen hemen her projede gördüğüm 20 kodu yapıştırın. Şüphesiz ve Microsoft, MI uygulamaya karar verirse, herkes aniden

1
@DaveZiffer muhtemelen, ancak doğru olması zor görünüyor. Gerçekten iyi çalıştığı bir dil veya uygulama biliyor musunuz?

4
@Dave Ya da sadece yararlılığını abartırsınız. Genel olarak kalıtım çok abartılır ve eksik vakalar arayüzler ve kompozisyon kullanılarak kolayca modellenebilir. Çoklu kalıtım gerçekten C # için işe yaramaz. Sahip olduğu tek avantaj, arayüz yöntemlerini kompozit üyelerdeki uygulamaya el ile devretme ihtiyacını ortadan kaldırmasıdır. Bu daha iyi çözülmüş olabilir (örneğin, karışımlar ekleyerek), ancak çoklu kalıtım eklemek için iyi bir neden yoktur.
Konrad Rudolph

Java'da uzun yıllar boyunca OO kodlaması yapıyorum, kalıtımın makul kullanımını (zaman zaman ağır, daha iyi öğrendiğimde daha az) kullanıyorum ve çoklu kalıtımın ve belki de 10 kez elde etmenin gerçekten zor olduğu tam olarak 1 kez buldum mevcut tasarımımı basitleştirmek için kullanabilirdim - ve birden fazla mirasa ihtiyaç duymamak ve genel tasarımın tasarımından daha iyi olması için yeniden tasarlayamadığım zaman tam olarak sıfır kez.
Bill K

Yanıtlar:


14

/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c bu soruyu güzel bir şekilde ele alıyor.

Benim düşüncem şu: Tasarımcılar muhtemelen iyi tasarım ilkelerini tanıtan bir dil yapmak istiyorlardı. Pekala, birden fazla mirasın mükemmel olduğu zamanlar var. Bunlar kuraldan ziyade istisnadır ve çok kolayca istismar edilebilir. Böylece tasarımcılar bunu yapmayı imkansız hale getirmeye karar verdiler.

İyi olacağı durumlarda, arayüzler kullanmanız gerekir. Bunlar beceriksiz de olsa çalışır; ama bu kadar onlara ihtiyacınız olmayacak.


8

Sadece neden olmadığını göstermek için, birden fazla kalıtım C ++ tarafından desteklenir, ancak MI ile yapacağınız kompozisyonun çoğunu ancak daha temiz bir şekilde gerçekleştirebileceğiniz için kesinlikle cesaretiniz kırılır. C ++ 'dan farklı olarak, C # "hibrit" tip OOP dili değildir, yani önceki bir dilden evrimleşmemiştir.

Gerçekten birden fazla mirasa ihtiyacınız varsa, birden fazla arabirim uygulayabilirsiniz.


6

Walter Bright hem MI'yı içermeyen D'nin yaratıcısı hem de tek başına bir C ++ derleyicisinin tamamını yazan tek kişidir. Ona göre, D'nin MI'dan yoksun olmasının nedeni, aynı anda etkili, basit ve kullanışlı bir MI sistemi oluşturmanın çok zor olmasıdır. Java ve C # benzer akıl yürütme şüpheli. Perl ve Python gibi diller birincil hedef olarak verimliliğe sahip değildir, bu nedenle basit ve kullanışlı, ancak verimli bir şekilde uygulanması zor bir sisteme sahiptirler. C ++ bir amaç olarak sadeliğe sahip görünmüyor, bu yüzden neredeyse hiç kimsenin anlamadığı çok karmaşık bir sistem yarattı.

Bence Walter tam hedefte. Bu kriterlerin üçünü de iyi karşılayan bir MI sistemine sahip herhangi bir dil varsa, lütfen bir yorum bırakın.


2
Eiffel, Common Lisp ve Dylan hakkında ne düşünüyorsun? Üçünün de basit ve kullanışlı olduğunu biliyorum. Hem Common Lisp hem de Dylan'ın performansta C ++ (ve hatta çoğu zaman bile C) ile rekabet edebileceğini ve hatta yenebileceğini biliyorum, bu da verimliliği tatmin ediyor gibi görünüyor. Ben do Eyfel biliyorum derleyici korkunç yavaş ama gelecek ürettiği derlenmiş kodun performansı hakkında hiçbir şey biliyorum.
Jörg W Mittag


-1

Çünkü dil tasarımcıları genel olarak daha iyi bir dil değil, daha iyi bir C ++ üretmek istiyorlardı. (Ne kadar başarılı oldukları tartışılabilir.)

C ++ tarzı çoklu kalıtımın bazı sorunları vardır ve bu nedenle C ++ 'dan türeyen insanlar genellikle atladı (Java, C #, D). Diğer diller, Eiffel ve Common Lisp iki ismi, farklı yapıyor ve aynı sorunları yok gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.