Zitat:
Botschaftsmethoden statisch
Falsch. Botschaftsmethoden sind schon imemr dynamische Methoden gewesen. Also auch keine virtuelle Methoden !!
Dynamische Methoden zeichnen sich dadurch aus das der Methode eine eindeutige Slot-ID zugeordnet wird. Das ist meistens ein Word der ein Index in die DMT -> Dynamic Method Table der Klasse ist. Virtuelle Methoden sind in der
VMT der Klasse gespeichert. Der Unterschied besteht im Speicherverbrauch dieser Tabellen. Die DMT ist wesentlich kompakter benötigt aber einen echt rießigen Calling-Overhead beim Aufrufen einer solchen Methode. Dynmisch statt Virtuell bezieht sich nämlich auf die Art und Weise wie man eine Dynamische Methode aufruft und benutzt. Man hat ja erstmal nur eine Slot-ID und ein Objekt. Nun muß eine Aufrufprocedure innerhalb der DMT dieser Objektklasse nach einem Eintrag mit der Slort-ID der Methode suchen. Findet sich in dieser Klasse keine Dynamische Methode mit dieser ID so wird mit der Vorfahrklasse das gleiche gemacht. Man sucht also ausgehend von der aktuellen Klasse des Objecte alle DMTs aller Vorfahrklassen so lange durch bis man die Slot-ID gefunden hat. Dort wird dann auch der Zeiger in das Codesegement an der die reale Methode steht gespeichert. Eine Klasse als Struktur erbt also ganz unterschiedlich bezogen auf die DMT und
VMT. Die
VMT einer neuen Klasse ist eine komplette Kopie der Vorfahrklasse plus alle virtuallen Methoden die in der neuen Klasse deklariert wurden. Logisch da nur so eine 1 zu 1 Beziehung der Virtuellen Methoden in der komplette Klassenhirarchie ermöglicht wird. An der gleichen Position in der
VMT steht immer die gleiche virtuelle Methode der kompletten Hierarchie, sonst könnte man garnicht eine Methode überschreiben. Die DMT einer neuen Klasse enthält dagegen nur die Einträge an dynamischen Methoden die in dieser Klasse implementiert wurden. Wurde eine dynamische Methode der Vorfahrklasse überschrieben so wird auch in der DMT der neuen klasse ein Eintrag mit der entsprechenden Slot-ID stehen, ansonsten fehlt dieser Eintrag. Die
VMT wiederum kopiert alle virtuellen Methoden für jede Klasse egal ob die aktuelle Klasse sie überschreibt oder nicht. Das kostet Speicherplatz.
Und in meinen Worten steckt noch was, ich sagte DMT -> Methoden die implementiert wurden und
VMT -> Methoden die deklariert wurden. Der Unterschied besteht nämlich darin das bei dynamischen Methoden exakt 2^16 Stück möglich wären und das das schon in der Klasse TObjekt festgelegt ist. Man kann also mit dynamischen Methoden Funktionaliät festlegen ohne wissen zu müssen wann, wo und ob die reale Implementierung einer dynamischen Methode real erfolgt. Dazu muß man aber in der Basisklasse keine Platzhaltermethode wie bei virtuellen Methoden vorsehen, also selbst die Implementation der Basisfunktionaliät kann bei dynamischen Methoden entfallen. Das einzigste was notwendig ist ist
1.) ein einheitliches Parameterinterface, bei Botschaftsmethoden eben die Einigung auf (var Msg: TMessage);
2.) die Bedeutung der Slot-IDs als Konstanten, eben wm_Paint = $xxxx.
Nun inherited kann man aufrufen vor oder nach der eigenen Implementierung oder auch garnicht. Das hängt einfach von der Zielsetzung ab.
Wird inherited in einer virtuellen Methode aufgerufen dann ist das wenig Code. Man schaut in der
VMT der Vorfahrklasse am exakt gleichen Index wie die akteulle Methode nach und lädt von dort den Zeiger auf die Vorfahrmethode und ruft sie per CALL auf (Parameter nicht vergessen). Bei dynamischen Methoden ist das bischen aufwendiger kann ja die Vorfahrklasse garkeine Implementierung zur aktuellen Slot-ID besitzen. Man muß also auch wieder mit einer speziellen Suchfunktion erstmal die DMTs der Vorfahrklassen durchsuchen.
Die Slot-ID ist die Zahl die man bei dynamischen Methoden hinter deren Deklaration vergeben muß oder kann
Botschaftmethoden sind dynamische Methoden mit dem Unterschied das man diese Slot-ID per "message wm_Paint" o.ä vorgibt.
Übrigens Botschaftmethoden sind nicht begrenzt auf Windows-Controls sondern funktionieren mit allen Klassen abgleitet von TObject. Das macht zb. Sinn für Datenobjekte zb. Nodes und Node-Bäume die Daten hierarisch verwalten und denoch auf Eingaben der Maus, des Keyboards oder sich selber zeichnen sollen. Auch Broadcasting Botschaften lassen sich so auf Datenobjekte anwenden, einfach indem man seine eigene Message Methoden in diese Datenobjekte implementiert.
Gruß Hagen