Mengapa C # tidak mendukung multiple inheritance?

10

Bahkan jika itu bisa menjadi praktik buruk, saya akan mengatakan bahwa ada waktu yang akan memenuhi tujuannya.

Amir Rezaei
sumber
1
Saya hanya suka bagaimana semua orang membuat semua alasan ini karena tidak adanya kemampuan yang benar-benar berguna dalam apa pun yang diproduksi Microsoft (MVP sangat mahir dalam hal ini). Dugaan saya adalah bahwa sebagian besar orang yang tidak memahami manfaat dari pewarisan berganda adalah mereka yang tidak memahami (dan tidak menggunakan) warisan sejak awal, karena mereka lebih menyukai copy-and- yang semakin populer paste-kode-20-kali yang saya lihat di hampir setiap proyek di mana-mana. Tidak diragukan lagi jika dan ketika Microsoft memutuskan untuk mengimplementasikan MI, semua orang akan tiba-tiba menjadi penggemar yang bersemangat, tidak perlu menunggu menjadi "penginjil", mengklaim sebagai
1
@ DavidZiffer mungkin, tetapi tampaknya sulit untuk memperbaikinya. Apakah Anda tahu bahasa atau implementasi di mana ia bekerja dengan sangat baik?
4
@Dave Atau Anda hanya melebih-lebihkan kegunaannya. Warisan secara umum terlalu dibesar-besarkan, dan kasing yang hilang dapat dengan mudah dimodelkan menggunakan antarmuka dan komposisi. Multiple inheritance benar-benar tidak berguna di C #. Satu-satunya keuntungan yang dimiliki adalah bahwa hal itu meniadakan kebutuhan untuk mendelegasikan metode antarmuka secara manual ke implementasi dalam anggota komposit. Ini bisa diselesaikan dengan lebih baik (misalnya dengan memperkenalkan mixin) tetapi itu bukan alasan yang baik untuk memperkenalkan banyak pewarisan.
Konrad Rudolph
Saya telah mengkode OO di java selama bertahun-tahun sekarang menggunakan pewarisan yang wajar (Berat di kali, kurang ketika saya belajar lebih baik) dan saya telah menemukan tepat 1 kali ketika itu benar-benar sulit untuk berkeliling multi-warisan dan mungkin 10 kali di mana saya bisa menggunakannya untuk menyederhanakan desain saya saat ini - dan persis nol kali ketika saya tidak bisa redisign untuk tidak memerlukan pewarisan berganda dan memiliki desain keseluruhan yang lebih baik daripada seharusnya.
Bill K

Jawaban:

14

/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c membahas pertanyaan ini dengan baik.

Pandangan saya adalah ini: Para desainer mungkin ingin membuat bahasa yang mempromosikan prinsip-prinsip desain yang baik. Ok, jadi ada saatnya beberapa pewarisan sempurna. Itu adalah pengecualian, bukan aturan, dan bisa disalahgunakan dengan mudah. Jadi, para perancang memutuskan untuk membuatnya mustahil dilakukan.

Untuk kasus-kasus di mana itu akan baik, Anda perlu menggunakan antarmuka. Itu bekerja, meskipun dengan kikuk; tetapi, Anda tidak akan membutuhkannya sebanyak itu.

Michael K.
sumber
8

Hanya untuk menggambarkan mengapa tidak, multiple inheritance didukung oleh C ++, tetapi sangat tidak disarankan karena Anda dapat menyelesaikan sebagian besar barang dengan komposisi yang Anda inginkan dengan MI, namun dengan cara yang jauh lebih bersih. Tidak seperti C ++, C # bukan bahasa OOP tipe "hybrid", artinya tidak berevolusi dari bahasa sebelumnya.

Jika Anda benar-benar membutuhkan banyak pewarisan, Anda dapat mengimplementasikan banyak antarmuka.

Jas
sumber
6

Walter Bright adalah pencipta D, yang tidak termasuk MI, dan satu-satunya orang yang pernah menulis seluruh kompiler C ++ sendirian. Menurutnya, alasan D kekurangan MI adalah bahwa terlalu sulit untuk membuat sistem MI yang secara bersamaan efisien, sederhana dan bermanfaat. Saya menduga Java dan C # menggunakan alasan yang sama. Bahasa seperti Perl dan Python tidak memiliki efisiensi sebagai tujuan utama, sehingga mereka memiliki sistem yang sederhana dan bermanfaat, tetapi sulit untuk diterapkan secara efisien. C ++ tampaknya tidak memiliki kesederhanaan sebagai tujuan, jadi itu menciptakan sistem yang sangat rumit yang hampir tidak ada yang mengerti.

Saya pikir Walter tepat sasaran. Jika ada bahasa yang memiliki sistem MI yang memenuhi ketiga kriteria ini dengan cukup baik, silakan tinggalkan komentar.

dsimcha
sumber
2
Apa pendapat Anda tentang Eiffel, Common Lisp dan Dylan? Saya tahu bahwa ketiganya sederhana dan bermanfaat. Dan saya tahu bahwa Common Lisp dan Dylan dapat bersaing dengan dan bahkan mengalahkan C ++ (dan seringkali bahkan C) dalam kinerja, sehingga tampaknya memuaskan efisiensi. Aku tidak tahu bahwa Eiffel compiler mengerikan lambat tapi saya tahu apa-apa tentang kinerja kode dikompilasi menghasilkan.
Jörg W Mittag
-1

Karena perancang bahasa tampaknya ingin menghasilkan C ++ yang lebih baik, bukan bahasa yang lebih baik secara umum. (Seberapa sukses mereka dapat diperdebatkan.)

C ++ - style multiple inheritance memiliki beberapa masalah, sehingga orang-orang yang berasal dari C ++ umumnya menghilangkannya (Java, C #, D). Bahasa lain, Eiffel dan Common Lisp untuk nama dua, melakukannya secara berbeda dan tampaknya tidak memiliki masalah yang sama.

David Thornley
sumber