Чому C # не підтримує багаторазове успадкування?


10

Навіть якщо це може бути погана практика, я б сказав, що є час, щоб він виконав своє призначення.


1
Мені просто подобається, як усі виправдовуються за відсутність цілком корисних можливостей у будь-якому виробництві Microsoft (MVP особливо спритні в цьому). Я здогадуюсь, що більшість людей, які не розуміють переваг багаторазового успадкування, - це ті, хто в першу чергу не розуміють (і не використовують) спадщину, тому що вони віддають перевагу все популярним копіювальним і paste-the-code-20 разів, що я бачу майже в кожному проекті скрізь. Без сумніву, якщо і коли Microsoft вирішить впровадити ІМ, кожен раптом стане захопленим ентузіастом, не чекайте "євангеліста", заявляючи про

1
@DaveZiffer напевно, але, здається, важко отримати право. Чи знаєте ви про мову чи реалізацію, де вона працює дуже добре?

4
@Dave Або ви просто завищуєте її корисність. Взагалі спадкування є завищеним, і відсутні справи можна легко моделювати за допомогою інтерфейсів та композиції. Багатократне успадкування справді марно в C #. Єдиною перевагою є те, що вона уникає необхідності вручну делегувати методи інтерфейсу для реалізації в складених елементах. Це можна було б вирішити краще (наприклад, шляхом введення міксинів), але це не є вагомою причиною для введення множинної спадщини.
Конрад Рудольф

Я кодую ОО в Java вже багато років, використовуючи розумно спадщину (сильно часом, менше, коли я навчився краще), і я знайшов рівно 1 раз, коли мені було дуже важко обійти багатонаступне успадкування і, можливо, 10 разів де я міг би використати його для спрощення свого сучасного дизайну - і рівно в нульовий раз, коли я не зміг його переробити, щоб не знадобилось багаторазове успадкування і мати загальний дизайн краще, ніж це було б з ним.
Білл К

Відповіді:


14

/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c гарно висвітлює це питання.

Я вважаю, що це: дизайнери, ймовірно, хотіли скласти мову, яка сприяла б хорошим принципам дизайну. Гаразд, так бувають випадки, що багаторазове успадкування є ідеальним. Це швидше виняток, а не правило, і ними можна зловживати дуже легко. Отже, дизайнери вирішили зробити це неможливим.

У тих випадках, коли це було б добре, потрібно використовувати інтерфейси. Вони працюють, хоч і незграбно; але вони вам для цього не знадобляться.


8

Просто для пояснення того, чому ні, багатократне успадкування підтримується C ++, але сильно не рекомендується, оскільки ви можете виконати більшість речей зі складом, який ви б хотіли з MI, однак набагато чистіше. На відміну від C ++, C # не є мовою OOP "гібридного" типу, тобто вона не розвивалася з попередньої мови.

Якщо вам дійсно потрібно багатократне успадкування, ви можете реалізувати кілька інтерфейсів.


6

Уолтер Брайт є творцем D, який не включає MI, і єдиною людиною, яка коли-небудь написала весь компілятор C ++. За його словами, причиною D не вистачає ІМ є те, що створити систему ІМ, яка одночасно ефективна, проста і корисна, занадто важко. Я підозрюю, що Java та C # використовують подібні міркування. Такі мови, як Perl та Python, не мають ефективності як основної мети, тому у них є проста і корисна система, але її важко ефективно реалізувати. C ++, схоже, не має простоти як мети, тому він створив надзвичайно складну систему, яку майже ніхто не розуміє.

Я думаю, що Уолтер прямо в цілі. Якщо існує будь-яка мова з системою ІМ, яка розумно добре задовольняє всі ці три критерії, залиште коментар.


2
Що ви думаєте про Ейфеля, Спільного Ліспа та Ділана? Я знаю, що всі троє і прості, і корисні. І я знаю, що і Common Lisp, і Dylan можуть конкурувати і навіть перемогти C ++ (а часто навіть і C) у продуктивності, так що, здається, задовольняє ефективність. Я дійсно знаю , що Ейфелева компілятор жахливо повільний , але я нічого НЕ знаю про виконання скомпільованого коду він виробляє.
Йорг W Міттаг


-1

Тому що мовні дизайнери, очевидно, хотіли створити кращу C ++, а не кращу мову взагалі. (Наскільки вони успішні, можна обговорити.)

Багатократне успадкування стилю C ++ має деякі проблеми, і тому люди, що походять із C ++, зазвичай його опускають (Java, C #, D). Інші мови, Ейфелева та Common Lisp, щоб назвати дві, роблять це по-різному і, схоже, не мають однакових проблем.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.