Die Ausgabe dieses Codeblocks ergibt für mich keinen Sinn

8

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%     
Garrett Biermann 08.04.2013, 06:15
quelle

3 Antworten

7

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 ).

    
MarcinJuraszek 08.04.2013 06:21
quelle
1

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%     
Fendy 08.04.2013 06:20
quelle
1

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.

    
daryal 08.04.2013 06:23
quelle

Tags und Links