Gute Fragen. Lassen Sie mich sie noch einmal sagen.
Warum ist es legal, eine Methode überhaupt mit einer anderen Methode auszublenden?
Lassen Sie mich diese Frage mit einem Beispiel beantworten. Sie haben eine Schnittstelle von CLR v1:
interface IEnumerable
{
IEnumerator GetEnumerator();
}
Super. Jetzt in CLR v2 haben Sie Generika und Sie denken "Mann, wenn wir nur Generika in v1 gehabt hätten, hätte ich dies zu einer generischen Schnittstelle gemacht. Aber ich habe es nicht getan. Ich sollte jetzt etwas damit kompatibles machen, das generisch ist, damit Ich bekomme die Vorteile von Generika, ohne die Abwärtskompatibilität mit Code zu verlieren, der IEnumerable erwartet. "
interface IEnumerable<T> : IEnumerable
{
IEnumerator<T> .... uh oh
Wie werden Sie die GetEnumerator-Methode aufrufen IEnumerable<T>
? Denken Sie daran, dass GetEnumerator auf der nicht generischen Basisschnittstelle ausgeblendet werden soll. Sie möchten niemals, dass dieses Ding aufgerufen wird, es sei denn, Sie befinden sich explizit in einer abwärtskompatiblen Situation.
Das allein rechtfertigt das Verstecken von Methoden. Weitere Gedanken zu Begründungen des Versteckens von Methoden finden Sie in meinem Artikel zu diesem Thema .
Warum verursacht das Verstecken ohne "neu" eine Warnung?
Weil wir Sie darauf aufmerksam machen möchten, dass Sie etwas verstecken und es möglicherweise versehentlich tun. Denken Sie daran, dass Sie möglicherweise versehentlich etwas verstecken, weil die Basisklasse von einer anderen Person bearbeitet wurde, anstatt dass Sie Ihre abgeleitete Klasse bearbeitet haben.
Warum ist das Verstecken ohne "neu" eher eine Warnung als ein Fehler?
Gleicher Grund. Möglicherweise verstecken Sie versehentlich etwas, weil Sie gerade eine neue Version einer Basisklasse ausgewählt haben. Das passiert die ganze Zeit. FooCorp erstellt eine Basisklasse B. BarCorp erstellt eine abgeleitete Klasse D mit einer Methodenleiste, da ihre Kunden diese Methode mögen. FooCorp sieht das und sagt, hey, das ist eine gute Idee, wir können diese Funktionalität auf die Basisklasse übertragen. Sie tun dies und liefern eine neue Version von Foo.DLL aus. Wenn BarCorp die neue Version aufnimmt, wäre es schön, wenn ihnen mitgeteilt würde, dass ihre Methode jetzt die Basisklassenmethode verbirgt.
Wir möchten, dass diese Situation eine Warnung und kein Fehler ist, da dies bedeutet, dass dies eine andere Form des Problems der spröden Basisklasse ist . C # wurde sorgfältig entwickelt, damit bei einer Änderung an einer Basisklasse die Auswirkungen auf Code, der eine abgeleitete Klasse verwendet, minimiert werden.
Warum wird die Standardeinstellung ausgeblendet und nicht überschrieben?
Weil virtuelles Überschreiben gefährlich ist . Durch die virtuelle Überschreibung können abgeleitete Klassen das Verhalten von Code ändern, der für die Verwendung von Basisklassen kompiliert wurde. Etwas Gefährliches wie eine Außerkraftsetzung zu tun, sollte etwas sein, das Sie bewusst und absichtlich tun , nicht zufällig.