Table of Contents

Prüfung der Aufrufkette bei Event-Handler

Informationen

  • Kategorien: Kernel | Klassenformeln
  • Version: 21.0.0.11226
  • Veröffentlichungsdatum: Freitag, 18. November 2016
  • Entwickler: Fischer
  • Benötigt Datenbankänderung: Nein
  • Betreff: Neue Compiler-Warnungen bei Event-Handler

Beschreibung

Es gibt zwei Typen von entity-spezifischen Events:

  1. Events, deren Event-Handler das Event (üblicherweise) vollständig und unabhängig von den geerbten Event-Handlern behandelt.
  2. Events, deren Event-Handler (üblicherweise) nur einen Klassen-spezifischen Teil des Events behandelt und zusätzlich die geerbten Event-Handler aufruft.

Events des 2. Typs (z.B. "EntityStoring" und "EntityStored") haben jetzt das Merkmal 'ChainHandler'.

Dadurch ist der Compiler in der Lage, spezifische Prüfungen auszuführen und entsprechende Warnungen auszugeben.

Die Prüfungen benötigen Informationen über die Vererbung der Event-Handler die beim lokalen Compilieren einzelner Klassenformeln im Sourcecode-Editor nicht zur Verfügung stehen. Geprüft wird nur beim Kompilieren aller Klassenformeln beim Programmstart, ausgegebene Warnungen sind in Datei ...\user<user-name>\log\compile.csv zu finden.

Bei den Prüfungen nimmt der Compiler an, dass ein Handler für ein Event mit Merkmal 'ChainHandler' alle geerbten Event-Handler aufrufen sollte. Bei Einfachvererbung kann max. ein Event-Handler geerbt werden (der dann wieder seinen geerbten Event-Handler aufruft), bei Mehrfachvererbung können es auch mehrere Event-Handler sein.

Diese Annahme ist nicht immer korrekt, dennoch sind die Warnungen hilfreich da sie auf potentielle und schwierig zu verfolgende Fehler hinweisen. Beim Event-Handler sollten gewollte Abweichungen von dieser Annahme durch Kommentare dokumentiert und die resultierenden Warnungen an dieser Stelle ausgeschaltet werden.

Die neuen Warnungen:

warning 21, InheritedEventHandlerNotCalled: Innerhalb eines Event-Handler wurde ein geerbter Event-Handler nicht aufgerufen. Dadurch wird ein für die Basisklasse spezifischer Teil des Events nicht ausgeführt. Gilt nur für Events mit Merkmal 'ChainHandler'.

Beispiel: warning 21: Inherited event handler '::Area::onEvent_EntityStoring' not called.

warning 22, EventHandlerUnreachable: Die Klasse hat durch Mehrfachvererbung mehr als einen Event-Handler geerbt. Der Kern ruft nur einen Event-Handler auf und ist gezwungen, sich für einen der geerbten Event-Handler zu entscheiden. Die anderen geerbten Event-Handler sind für Events dieser Klasse nicht erreichbar, ein Teil der für das Event implementierten Behandlung wird nicht durchgeführt. Zum Auflösen des Konflikts sollte für die Klasse ein eigener Eventhandler implementiert werden der alle geerbten Event-Handler aufruft. Gilt nur für Events mit Merkmal 'ChainHandler'.

Beispiel: warning 22: Cannot call multiple event handlers inherited by class 'Rent_unit'. Implement 'onEvent_EntityStoring' for this class and call inherited handler '::Area::onEvent_EntityStoring' and '::Rent_object::onEvent_EntityStoring'.