Vergleich von Delphi und Visual C++ - Inhalt
Vergleich von Delphi und Visual C++ - Inhalt
Vergleich von Delphi und Visual C++ - Inhalt
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Vergleich</strong> <strong>von</strong> <strong>Delphi</strong> <strong>und</strong> <strong>Visual</strong> <strong>C++</strong> - Kapitel 2C<br />
Den Aufruf einer virtuellen Methode per Methoden-Index kann man sich zur Laufzeit grob so vorstellen:<br />
1. Aktuelles Objekt <strong>und</strong> Klassentyp dieses Objekts ermitteln.<br />
2. VMT-Array für diesen Klassentyp aufsuchen.<br />
3. Element VMT_ARRAY[MethodenIndex] auslesen. Man erhält die Einsprung-Adresse, an der die<br />
Funktion beginnt, die für das aktuelle Objekt aufgerufen werden soll.<br />
4. Zu dieser Adresse springen <strong>und</strong> Abarbeitung beginnen. Als Parameter wird der this- / Self - Parameter<br />
(implizit) an die Methode übergeben.<br />
Der Aufruf virtueller Methoden läuft, trotz des großen Aufwands, recht schnell ab, benötigt aber natürlich minimal mehr Zeit als der<br />
Aufruf statischer Methoden.<br />
Zur Realisierung dynamischer Methoden legt Object Pascal neben der VMT noch eine zweite, dynamische Methodentabelle (DMT) für<br />
jede Klasse an. Auch diese Tabelle stellt ein Array <strong>von</strong> Pointern auf Methoden dar, ist jedoch anders aufgebaut als die VMT. Zu jedem<br />
Pointer (=Value) existiert ein numerischer Schlüssel (=Key). Beim Aufruf einer dynamic- Methode wird nicht einfach ein Index zum<br />
Zugriff verwendet, sondern das Array anhand des Keys (der die Rolle des Indexes übernimmt) durchsucht. Anders als bei den VMTs hat<br />
jede Klasse nur die Methoden-Einträge in der DMT, die mit dynamic neu deklariert bzw. die mit override als polymorphe Nachfahren einer<br />
dynamischen Methode deklariert wurden. Dafür besitzen DMTs einen Zeiger, der auf die DMT der Elternklasse verweist. Wenn die Suche<br />
nach dem Key in der DMT der Klasse erfolglos blieb, werden die DMTs der Elternklasse(n) durchsucht, notfalls bis zurück zur DMT der<br />
Klasse TObject.<br />
Dynamische Methoden bieten nur dann Vorteile, wenn eine Basisklasse sehr viele virtuelle Methoden <strong>und</strong> eine Anwendung zusätzlich sehr<br />
viele Nachkommen-Klassen deklariert, <strong>und</strong> zwar überwiegend ohne override. Der Mechanismus der dynamischen Methoden ist<br />
hauptsächlich für die Implementierung <strong>von</strong> Botschaftsbehandlungsmethoden gedacht. Gegenüber "normalen" virtuellen Methoden ist der<br />
Zugriff langsamer, dafür wird durch eine DMT aber weniger Speicherplatz verbraucht als für eine entsprechende VMT. Eine virtuelle<br />
Methodentabelle für eine bestimmte Klasse ist immer mindestens so groß, wie die VMT der Elternklasse.<br />
Botschaftsbehandlungs-Methoden sind ebenfalls nur in Object Pascal realisiert. Sie dienen dazu, benutzerdefinierte Antworten auf<br />
dynamisch zugeteilte Botschaften zu implementieren. Sie sind intern als dynamische Methoden realisiert.<br />
Windows-Programme werden oft durch einen Strom <strong>von</strong> Ereignissen aktiviert, die durch äußere Einflüsse hervorgerufen wurden.<br />
Anwendungen, die eine Benutzerschnittstelle aufweisen, werden durch ereignis-auslösende Eingabegeräte wie Tastatur <strong>und</strong> Maus bedient.<br />
Jedes Drücken einer Taste, jeder Klick mit der Maus erzeugt Botschaften, die die Anwendung empfängt. Es ist die Aufgabe der<br />
Anwendung, auf diese Botschaften sinnvoll im Sinne der Anwendung zu reagieren. Botschaftsbehandlungs-Methoden eignen sich<br />
hervorragend, um benutzerdefiniert auf Windows-Botschaften reagieren zu können. Folgerichtig setzt <strong>Delphi</strong>s Klassenbibliothek<br />
Botschaftsbehandlungs-Methoden dazu ein, um die Behandlung <strong>von</strong> Windows-Botschaften zu implementieren. Andererseits sind aber die<br />
Botschaftsbehandlungs-Methoden vollkommen unabhängig vom Nachrichtensystem Windows.<br />
Eine Methode wird zu einer botschaftsverarbeitenden Methode, indem an ihre Deklaration das Schlüsselwort "message", gefolgt <strong>von</strong> einer<br />
ganzzahligen, positiven Konstanten angehängt wird. Diese Konstante ist der Botschaftsbezeichner.<br />
type<br />
TMyButton = class(TButton)<br />
procedure WMButton1Down(var Message); message WM_LBUTTONDOWN;<br />
...<br />
end;<br />
Zusätzlich muß die Methode eine Prozedurmethode sein, die über genau einen var-Parameter beliebigen Typs verfügt. Auch ein<br />
untypisierter var-Parameter ist erlaubt, so daß die Übergabe beliebiger Typen möglich wird. Wichtig für das Funktionieren des<br />
Botschaftsmechanismus ist nur, daß die ersten vier Byte des var-Parameters die Nummer der Botschaft enthalten. Die darauf folgenden<br />
Daten können vom Programmierer frei bestimmt werden.<br />
http://ourworld.compuserve.com/homepages/praxisservice/kapit2c.htm (15 of 33) [19.05.2000 15:30:15]