Warum unterstützt C # keine Mehrfachvererbung?

10

Selbst wenn es schlechte Praktiken sein könnten, würde ich sagen, dass es Zeit gibt, dass es seinen Zweck erfüllen würde.

Amir Rezaei
quelle
1
Ich finde es einfach toll, wie jeder all diese Ausreden für das Fehlen einer völlig nützlichen Funktion in dem, was Microsoft produziert, macht (MVPs sind besonders geschickt darin). Ich vermute, dass die meisten Leute, die die Vorteile der Mehrfachvererbung nicht verstehen, diejenigen sind, die die Vererbung überhaupt nicht verstehen (und nicht verwenden), weil sie das allseits beliebte Copy-and- 20-mal den Code einfügen, den ich in fast jedem Projekt überall sehe. Kein Zweifel, wenn und wann Microsoft beschließt, MI zu implementieren, wird jeder plötzlich ein übermütiger Enthusiast, keine Wartezeit ein "Evangelist", der behauptet
1
@ DaveZiffer wahrscheinlich, aber es scheint schwierig zu sein, richtig zu machen. Kennen Sie eine Sprache oder Implementierung, in der es wirklich gut funktioniert?
4
@ Dave Oder Sie überschätzen einfach seine Nützlichkeit. Die Vererbung wird im Allgemeinen stark überbewertet, und die fehlenden Fälle können mithilfe von Schnittstellen und Zusammensetzung leicht modelliert werden. Mehrfachvererbung ist in C # wirklich nutzlos. Der einzige Vorteil besteht darin, dass die Schnittstellenmethoden nicht manuell an die Implementierung in den zusammengesetzten Elementen delegiert werden müssen. Dies hätte besser gelöst werden können (z. B. durch Einführung von Mixins), aber es ist kein guter Grund, Mehrfachvererbung einzuführen.
Konrad Rudolph
Ich habe OO in Java seit vielen Jahren codiert und die Vererbung vernünftig genutzt (manchmal stark, weniger, wenn ich besser gelernt habe), und ich habe genau 1 Mal gefunden, als es wirklich schwierig war, Mehrfachvererbung zu umgehen, und vielleicht 10 Mal wo ich es hätte verwenden können, um mein aktuelles Design zu vereinfachen - und genau null Mal, wenn ich es nicht neu gestalten konnte, um keine Mehrfachvererbung zu benötigen und das Gesamtdesign besser zu haben, als es damit gewesen wäre.
Bill K

Antworten:

14

/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c behandelt diese Frage gut.

Ich gehe davon aus: Die Designer wollten wahrscheinlich eine Sprache entwickeln, die gute Designprinzipien fördert. Ok, es gibt Zeiten, in denen Mehrfachvererbung perfekt ist. Dies ist jedoch eher die Ausnahme als die Regel und kann sehr leicht missbraucht werden. Also beschlossen die Designer, dies unmöglich zu machen.

In den Fällen, in denen dies sinnvoll wäre, müssen Sie Schnittstellen verwenden. Diese arbeiten, wenn auch ungeschickt; Aber dafür brauchen Sie sie nicht so sehr.

Michael K.
quelle
8

Nur um zu veranschaulichen, warum nicht, wird die Mehrfachvererbung von C ++ unterstützt, es wird jedoch dringend davon abgeraten, da Sie die meisten Aufgaben mit Komposition erledigen können, die Sie mit MI tun würden, jedoch auf eine viel sauberere Art und Weise. Im Gegensatz zu C ++ ist C # keine OOP-Sprache vom Typ "Hybrid", dh es hat sich nicht aus einer früheren Sprache entwickelt.

Wenn Sie wirklich mehrere Vererbungen benötigen, können Sie mehrere Schnittstellen implementieren.

Jas
quelle
6

Walter Bright ist sowohl der Schöpfer von D, der MI nicht enthält, als auch die einzige Person, die jemals einen ganzen C ++ - Compiler selbst geschrieben hat. Seiner Meinung nach fehlt D der MI, weil es zu schwierig ist, ein MI-System zu erstellen, das gleichzeitig effizient, einfach und nützlich ist. Ich vermute, dass Java und C # ähnliche Argumente verwenden. Sprachen wie Perl und Python haben keine Effizienz als primäres Ziel, daher haben sie ein System, das einfach und nützlich ist, aber schwer effizient zu implementieren ist. C ++ scheint keine Einfachheit als Ziel zu haben, daher hat es ein massiv kompliziertes System geschaffen, das fast niemand versteht.

Ich denke, Walter ist genau richtig. Wenn es eine Sprache gibt, die ein MI-System hat, das alle drei Kriterien einigermaßen gut erfüllt, hinterlassen Sie bitte einen Kommentar.

Dsimcha
quelle
2
Was denkst du über Eiffel, Common Lisp und Dylan? Ich weiß, dass alle drei einfach und nützlich sind. Und ich weiß, dass sowohl Common Lisp als auch Dylan mit C ++ (und oft sogar C) in der Leistung konkurrieren und diese sogar schlagen können, so dass dies die Effizienz zu befriedigen scheint. Ich weiß , dass der Eiffel- Compiler schrecklich langsam ist, aber ich weiß so gut wie nichts über die Leistung des kompilierten Codes, den er erzeugt.
Jörg W Mittag
-1

Weil die Sprachdesigner anscheinend ein besseres C ++ produzieren wollten, keine bessere Sprache im Allgemeinen. (Wie erfolgreich sie waren, kann diskutiert werden.)

Die Mehrfachvererbung im C ++ - Stil weist einige Probleme auf, sodass Personen, die aus C ++ stammen, diese im Allgemeinen weggelassen haben (Java, C #, D). Andere Sprachen, Eiffel und Common Lisp, um nur zwei zu nennen, machen es anders und scheinen nicht die gleichen Probleme zu haben.

David Thornley
quelle