Der Laufzeittyp aller aufrufenden Instanzen ist D. Daher sollten alle Aufrufe von F () die in D deklarierte Methode F () sein.
%Vor%Die Ausgabe ist:
%Vor%Sollte die Ausgabe nicht lauten:
%Vor%Versionierung mit Überschreibung und neuen Schlüsselwörtern (C # -Programmierhandbuch)
Wenn der Methode in der abgeleiteten Klasse das neue Schlüsselwort vorangestellt wird, Die Methode wird als unabhängig von der Methode in der Basis definiert Klasse.
Sie sind also F
Methoden von A
und B
sind nicht verbunden mit diesen von C
und D
, und deshalb bekommen Sie, was Sie bekommen.
Zur Laufzeit sucht CLR nach virtual
Methodenimplementierung, die verwendet werden sollte, beginnend mit dem Typ, für den die Variablen deklariert wurden, bis sie tatsächlich eingegeben wurde. Für a.F()
und b.F()
stoppt es bei B.F()
-Deklaration, weil C.F()
eine andere Methode ist (wegen new
).
Sie verwenden new public virtual void F()
in Klasse C: B. Dies bedeutet, dass die F()
in der Klasse C
und die F()
in der Klasse B
eine andere Methode sind.
Wenn Sie also C
auf Klasse D
überschreiben, wird die Methode F()
in der Klasse D
aus der Klasse C
, nicht B
überschrieben.
Ein anderes offensichtliches Beispiel kann so aussehen:
%Vor%Es sollte nicht ...
%Vor% Dies bedeutet, dass Sie eine Klasse vom Typ A
erstellen. Und da Sie die zugehörige Methode explizit in der Klasse B
; A
verwendet die Methode in der Klasse B
.
Andererseits in dieser Zeile;
%Vor% Sie erklären, dass Sie die F()
-Methode nicht aus der Basis verwenden möchten, indem Sie das Schlüsselwort new
verwenden.
Wenn Sie die F()
-Methode in den Klassen D
und C
überschrieben hätten, hätte jede Instanz die F()
-Methode aufgerufen, die in D
class deklariert wurde.
Tags und Links c# virtual-functions