2016-06-03 14 views
2

Kann jemand das Verhalten dieses Codes erklären, wie ich mit Polymorphismus spiele ich mit diesem Code durch Zufall kam, und ich bin wirklich mit seinem Verhalten verwirrt:Polymorphismus: Was ist der wahre Typ der aufgerufenen Methode?

public class Book 
{ 
    public virtual void Method() 
    { 
     Console.WriteLine("Book/ I am here in "+ GetType().Name); 
    } 
} 
class Chapter : Book 
{ 
    public new void Method() 
    { 
     Console.WriteLine("Chapter/ I am here in "+ GetType().Name); 
    } 

    static void Main() 
    { 
     Book myBook = new Chapter() ; 
     myBook.Method(); 
    } 
} 

Die Ausgabe dieses Programms ist

Buch/ich bin hier in Kapitel

Dies bedeutet, dass die Instanz das Verfahren innerhalb des Buches Klasse genannt, wird aber die Art chapter. Ist die Methode GetType() von der Instanz abhängig, mit der sie aufgerufen wurde, nicht von der Klasse, in der sie liegt?

+0

Es gibt nicht viel Bedarf für eine Methode, die den statischen Typ basierend auf der Anrufposition zurückgibt, da Sie diese Informationen leichter zur Hand haben. –

Antwort

1

Ja, GetType() ruft zur Laufzeit den tatsächlichen Typ aus dem Objekt (der Instanz) ab.

Wenn Sie public new void Method() in öffentliche override void Method() geändert haben, würde es die andere Zeile ausdrucken.

Siehe MSDN:

Rückgabewert

Typ: System.Type

Der genaue Laufzeittyp der aktuellen Instanz ab.

1

new zerstört Polymorphie. Das ist der springende Punkt von new, tatsächlich - versteckt die virtuelle Implementierung. Wenn Sie die Implementierung einer Methode in einem abgeleiteten Typ ändern möchten, müssen Sie override anstelle von new verwenden. Dadurch wird sichergestellt, dass die überschriebene Methode aufgerufen wird, auch wenn der richtige Typ zum Zeitpunkt der Kompilierung nicht bekannt ist.