Dlaczego C # nie obsługuje wielokrotnego dziedziczenia?

10

Nawet jeśli mogłyby to być złe praktyki, powiedziałbym, że jest czas, aby spełnił swój cel.

Amir Rezaei
źródło
1
Uwielbiam sposób, w jaki wszyscy robią te wszystkie wymówki z powodu braku całkowicie przydatnych możliwości w tym, co produkuje Microsoft (MVP są w tym szczególnie biegli). Domyślam się, że większość ludzi, którzy nie rozumieją korzyści wynikających z wielokrotnego dziedziczenia, to ci, którzy nie rozumieją (i nie używają) dziedziczenia w pierwszej kolejności, ponieważ wolą zawsze popularne kopiowanie i- wklej kod 20 razy, co widzę w prawie każdym projekcie na całym świecie. Bez wątpienia i kiedy Microsoft zdecyduje się wdrożyć MI, wszyscy nagle staną się oszustami, entuzjastami, nie czekaj „ewangelistą”, twierdząc, że
1
@DaveZiffer prawdopodobnie, ale wydaje się, że trudno jest naprawić. Czy znasz język lub implementację, w której działa naprawdę dobrze?
4
@Dave Lub po prostu przeceniasz jego przydatność. Dziedziczenie jest ogólnie przereklamowane, a brakujące przypadki można łatwo modelować za pomocą interfejsów i kompozycji. Wielokrotne dziedziczenie jest naprawdę bezużyteczne w języku C #. Jedyną zaletą jest to, że eliminuje potrzebę ręcznego delegowania metod interfejsu do implementacji w elementach złożonych. To mogło być lepiej rozwiązane (np wprowadzając wstawek), ale to nie jest dobry powód, aby wprowadzić dziedziczenie wielokrotne.
Konrad Rudolph,
Od wielu lat koduję OO w Javie, rozsądnie wykorzystując dziedziczenie (czasami ciężko, mniej kiedy lepiej się uczyłem) i znalazłem dokładnie 1 raz, kiedy naprawdę trudno było obejść wielokrotne dziedziczenie, a może 10 razy gdzie mógłbym go użyć, aby uprościć mój obecny projekt - i dokładnie zero razy, kiedy nie mogłem go przeprojektować, aby nie wymagał wielokrotnego dziedziczenia i miał ogólny projekt lepszy niż byłby z nim.
Bill K

Odpowiedzi:

14

/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c ładnie obejmuje to pytanie.

Podejrzewam, że: projektanci prawdopodobnie chcieli stworzyć język promujący dobre zasady projektowania. Ok, więc czasami wielokrotne dziedziczenie jest idealne. Są to jednak wyjątki, a nie reguły, i można je bardzo łatwo nadużywać. Tak więc projektanci postanowili uniemożliwić.

W przypadkach, w których byłoby dobrze, musisz użyć interfejsów. Ci działają, choć niezdarnie; ale nie będziecie ich tak bardzo potrzebować.

Michael K.
źródło
8

Aby zilustrować, dlaczego nie, C ++ obsługuje wielokrotne dziedziczenie, ale jest mocno odradzane, ponieważ większość rzeczy można osiągnąć za pomocą kompozycji, którą zrobiłbyś z MI, ale w znacznie czystszy sposób. W przeciwieństwie do C ++, C # nie jest językiem OOP typu „hybrydowego”, tzn. Nie ewoluował z poprzedniego języka.

Jeśli naprawdę potrzebujesz wielokrotnego dziedziczenia, możesz zaimplementować wiele interfejsów.

Jas
źródło
6

Walter Bright jest zarówno twórcą D, który nie obejmuje MI, jak i jedyną osobą, która sama napisała cały kompilator C ++. Według niego powodem braku MI jest to, że zbyt trudno jest stworzyć system MI, który jest jednocześnie wydajny, prosty i użyteczny. Podejrzewam, że Java i C # używają podobnego rozumowania. Języki takie jak Perl i Python nie mają wydajności jako podstawowego celu, więc mają system, który jest prosty i użyteczny, ale trudny do wdrożenia. C ++ nie wydaje się mieć prostoty jako celu, dlatego stworzył bardzo skomplikowany system, który prawie nikt nie rozumie.

Myślę, że Walter ma rację. Jeśli istnieje jakikolwiek język, który ma system MI, który spełnia wszystkie trzy z tych kryteriów w miarę dobrze, proszę zostawić komentarz.

dsimcha
źródło
2
Co sądzisz o Eiffel, Common Lisp i Dylan? Wiem, że wszystkie trzy są proste i użyteczne. Wiem, że zarówno Common Lisp, jak i Dylan mogą konkurować, a nawet pokonać C ++ (a często nawet C) pod względem wydajności, więc wydaje się to zadowalać wydajność. I nie wiem, że Eiffla kompilator jest strasznie powolny, ale wiem nic o wykonywaniu skompilowanego kodu produkuje.
Jörg W Mittag
-1

Ponieważ projektanci języków najwyraźniej chcieli stworzyć lepszy C ++, a nie lepszy ogólnie język. (Jak sukcesy mogą być przedmiotem dyskusji.)

Wielokrotne dziedziczenie w stylu C ++ ma pewne problemy, dlatego ludzie wywodzący się z C ++ zazwyczaj go pomijali (Java, C #, D). Inne języki, Eiffel i Common Lisp, by wymienić dwa, robią to inaczej i nie wydają się mieć takich samych problemów.

David Thornley
źródło