Was machen Virtual und Override hinter der Szene?

7

Ich habe gerade verstanden, dass Virtual und Override für (Ich kann nicht so lange eine Verwendung finden). Jetzt benutze ich sie in Factory Patterns. Meine Frage ist, was macht Virtual und Override hinter der Szene? Ich bin bereit, in IL und Machine Code Zeug zu gehen.

    
Athiwat Chunlakhan 21.08.2009, 06:17
quelle

3 Antworten

15

Ich kann Ihnen keine Einblicke geben, wie es in IL gemacht wird, aber die grundlegende Theorie ist einfach.

Wenn der Compiler eine virtuelle Methodendeklaration sieht, fügt er die Methode nicht der Klasse hinzu, sondern fügt sie in eine so genannte vtable (eine virtuelle Methode) ein Tabelle) für diese Klasse, die Zeiger auf Funktionen enthält.

Da nun vtable ein Teil der Klasse ist, wird es von seinen Unterklassen geerbt, und somit werden auch die virtuellen Methoden vererbt. Jetzt kommt das Override-Bit. Wenn der Compiler eine überschreiben in einer Methodendeklaration sieht, sucht er nach vtable , sucht nach der zu überschreibenden Methode und ändert den Funktionszeiger so, dass er auf den neuen verweist Definition.

Damit erhalten Sie sowohl eine Vererbung von Methoden aus übergeordneten Klassen als auch die Möglichkeit, ihre Definitionen in untergeordneten Klassen zu ändern.

Weitere Informationen finden Sie im Wikipedia-Artikel auf der virtuellen Methodentabelle .

    
paracycle 21.08.2009, 06:27
quelle
4

Sie müssen nicht in die IL gehen - virtual und override umfassen ein bekanntes Objektorientierungskonzept, bekannt als Polymorphismus . Wenn auf eine polymorphe Methode oder Eigenschaft zugegriffen wird, wird die Methode / Eigenschaft , die tatsächlich gilt, nur zur Laufzeit festgelegt. Unter der Haube wird im Prinzip die richtige Methode (im Falle einer Eigenschaft ist es auch eine Methode) durch Zugriff auf eine virtuelle Methodentabelle bestimmt - eine Nachschlagetabelle zum Finden der richtigen Methode, basierend auf der Laufzeittyp.

    
Eric Smith 21.08.2009 06:28
quelle
4

Wenn Sie an der IL interessiert sind, verwenden Sie ildasm.exe, um ein kompiliertes Programm (DLL oder EXE) zu sehen. Sie werden sehen, dass die Methoden, die Sie als "virtuell" markieren, in der IL einfach als "virtuell" gekennzeichnet werden.

Die Magie passiert in der Laufzeit. Die CLR erstellt eine "Method-Dispatch-Tabelle" (oder "virtuelle Methodentabelle"), mit der die Methoden Ihrer Klasse im Speicher lokalisiert werden. Um den Polymorphismus zuzulassen, wobei derselbe Methodenname abhängig vom Laufzeittyp unterschiedliche Dinge bedeutet, ist für virtuelle Methoden eine zusätzliche Suche erforderlich. (Man könnte sagen, dass sie "virtuelle" Methoden genannt werden, gerade weil sie "aufgrund" ihrer Arbeit ausgewählt werden - aber siehe @ Pavels Kommentare.) Joe Duffy hat es so ausgedrückt:

  

Ein virtueller Methodenaufruf ist sehr viel   wie ein gewöhnlicher Anruf, außer dass es   muss das Ziel des Aufrufs nachschlagen   Laufzeit basiert auf dem Objekt 'this'.

Das sind die Grundlagen. Don Box ist eine gute Lektüre, wenn Sie wirklich weiter gehen wollen.

    
harpo 21.08.2009 06:30
quelle

Tags und Links