Почему C # не поддерживает множественное наследование?

10

Даже если это может быть плохой практикой, я бы сказал, что есть время, когда оно выполнит свое предназначение.

Амир Резаи
источник
1
Мне просто нравится, как все оправдываются отсутствием абсолютно полезной возможности во всем, что производит Microsoft (MVP особенно искусны в этом). Я предполагаю, что большинство людей, которые не понимают преимуществ множественного наследования, это те, кто не понимает (и не использует) наследование в первую очередь, потому что они предпочитают все более популярное копирование и вставить-код-20 раз, что я вижу почти в каждом проекте повсюду. Без сомнения, если и когда Microsoft решит внедрить MI, все внезапно станут мудрыми энтузиастами, не ждите «евангелиста», утверждая, что
1
@DaveZiffer, вероятно, но, кажется, трудно понять, как правильно. Знаете ли вы язык или реализацию, где он работает действительно хорошо?
4
@Dave Или вы просто переоцениваете его полезность. Наследование в целом переоценивается, а недостающие случаи можно легко смоделировать с помощью интерфейсов и композиции. Множественное наследование действительно бесполезно в C #. Единственное преимущество заключается в том, что он устраняет необходимость вручную делегировать методы интерфейса для реализации в составных элементах. Эту проблему можно было бы решить лучше (например, путем введения миксинов), но нет веской причины для множественного наследования.
Конрад Рудольф
Я много лет кодирую OO в Java, используя разумное использование наследования (иногда тяжело, реже учусь лучше), и я нашел ровно 1 раз, когда было действительно трудно обойти множественное наследование, и, может быть, 10 раз где я мог бы использовать его, чтобы упростить мой текущий дизайн - и ровно ноль раз, когда я не мог переназначить его, чтобы не требовалось множественное наследование и иметь общий дизайн лучше, чем это было бы с ним.
Билл К

Ответы:

14

/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c хорошо освещает этот вопрос.

Мое мнение таково: дизайнеры, вероятно, хотели создать язык, который бы продвигал хорошие принципы дизайна. Итак, бывают случаи, когда множественное наследование идеально. Это скорее исключение, чем правило, и им можно очень легко злоупотребить. Итак, дизайнеры решили сделать это невозможным.

Для тех случаев, когда это было бы хорошо, вам нужно использовать интерфейсы. Те работают, хотя неуклюже; но они вам не понадобятся для этого.

Майкл К
источник
8

Просто чтобы проиллюстрировать, почему нет, множественное наследование поддерживается C ++, но настоятельно не рекомендуется, так как вы можете выполнить большинство вещей с помощью композиции, которую вы сделали бы с MI, но гораздо более чистым способом. В отличие от C ++, C # не является языком ООП «гибридного» типа, то есть он не эволюционировал по сравнению с предыдущим языком.

Если вам действительно нужно множественное наследование, вы можете реализовать несколько интерфейсов.

Jas
источник
6

Уолтер Брайт является одновременно создателем D, в который не входит MI, и единственным человеком, который когда-либо сам писал весь C ++ компилятор. По его словам, причина, по которой D испытывает недостаток в MI, заключается в том, что слишком сложно создать систему MI, которая одновременно эффективна, проста и полезна. Я подозреваю, что Java и C # используют аналогичные рассуждения. Такие языки, как Perl и Python, не ставят своей главной целью эффективность, поэтому у них есть система, которая проста и полезна, но сложно реализовать эффективно. С ++, похоже, не ставит своей целью простоту, поэтому он создал чрезвычайно сложную систему, которую почти никто не понимает.

Я думаю, что Уолтер точно в цель. Если существует какой-либо язык с системой MI, которая удовлетворительно удовлетворяет всем трем критериям, оставьте комментарий.

dsimcha
источник
2
Что вы думаете об Эйфелевой, Common Lisp и Dylan? Я знаю, что все три из них просты и полезны. И я знаю, что и Common Lisp, и Dylan могут конкурировать и даже превосходить C ++ (и часто даже C) по производительности, так что это, кажется, удовлетворяет эффективности. Я действительно знаю , что Эйфелева компилятор ужасно медленный , но я ничего не знаю о выполнении скомпилированного кода он производит.
Йорг Миттаг,
-1

Потому что разработчики языка явно хотели создать лучший C ++, а не лучший язык в целом. (Насколько успешными они были, можно обсудить.)

У множественного наследования в стиле C ++ есть некоторые проблемы, и поэтому люди, наследующие C ++, обычно его пропускают (Java, C #, D). Другие языки, Eiffel и Common Lisp, чтобы назвать два, делают это по-разному и, похоже, не имеют таких же проблем.

Дэвид Торнли
источник