Ich bin überrascht, dass es hier einen solchen Konsens zu geben scheint, dass nicht virtuell standardmäßig der richtige Weg ist, Dinge zu tun. Ich werde auf der anderen - ich denke pragmatischen - Seite des Zauns herunterkommen.
Die meisten Rechtfertigungen lesen sich für mich wie das alte Argument "Wenn wir Ihnen die Macht geben, könnten Sie sich selbst verletzen". Von Programmierern?!
Mir scheint, dass der Codierer, der nicht genug wusste (oder nicht genug Zeit hatte), um seine Bibliothek für Vererbung und / oder Erweiterbarkeit zu entwerfen, der Codierer ist, der genau die Bibliothek erstellt hat, die ich wahrscheinlich reparieren oder optimieren muss - genau die Bibliothek, in der die Fähigkeit zum Überschreiben am nützlichsten wäre.
Die Häufigkeit, mit der ich hässlichen, verzweifelten Workaround-Code schreiben musste (oder die Verwendung aufgeben und meine eigene alternative Lösung verwenden musste), weil ich nicht weit überschreiben kann, überwiegt bei weitem die Häufigkeit, mit der ich jemals gebissen wurde ( zB in Java) durch Überschreiben, wo der Designer es vielleicht nicht in Betracht gezogen hat.
Standardmäßig nicht virtuell macht mein Leben schwerer.
UPDATE: Es wurde [ganz richtig] darauf hingewiesen, dass ich die Frage nicht wirklich beantwortet habe. Also - und mit Entschuldigung, dass ich ziemlich spät bin ...
Ich wollte in der Lage sein, etwas Markiges zu schreiben wie "C # implementiert Methoden standardmäßig als nicht virtuell, weil eine schlechte Entscheidung getroffen wurde, die Programme höher bewertet als Programmierer". (Ich denke, das könnte aufgrund einiger anderer Antworten auf diese Frage gerechtfertigt sein - wie Leistung (vorzeitige Optimierung, irgendjemand?) Oder Gewährleistung des Verhaltens von Klassen.)
Mir ist jedoch klar, dass ich nur meine Meinung äußern würde und nicht die endgültige Antwort, die Stack Overflow wünscht. Sicherlich dachte ich, auf höchster Ebene lautet die endgültige (aber nicht hilfreiche) Antwort:
Sie sind standardmäßig nicht virtuell, da die Sprachdesigner eine Entscheidung treffen mussten und genau das haben sie gewählt.
Jetzt denke ich, den genauen Grund, warum sie diese Entscheidung getroffen haben, werden wir nie ... oh, warte! Das Protokoll eines Gesprächs!
Es scheint also, dass die Antworten und Kommentare hier zu den Gefahren des Überschreibens von APIs und der Notwendigkeit, explizit für die Vererbung zu entwerfen, auf dem richtigen Weg sind, aber alle einen wichtigen zeitlichen Aspekt vermissen: Anders 'Hauptanliegen war es, das Implizite einer Klasse oder API beizubehalten Vertrag über Versionen . Und ich denke, er ist eher besorgt darüber, dass sich die .Net / C # -Plattform unter Code ändern kann, als darüber, dass sich der Benutzercode über der Plattform ändert. (Und sein "pragmatischer" Standpunkt ist genau das Gegenteil von meinem, weil er von der anderen Seite schaut.)
(Aber hätten sie nicht einfach standardmäßig virtuell auswählen und dann "final" durch die Codebasis pfeffern können? Vielleicht ist das nicht ganz dasselbe ... und Anders ist eindeutig schlauer als ich, also werde ich es lügen lassen.)
this
Referenz null ist. Sehen Sie hier für weitere Informationen.