Code: Alles auswählen.
Beispiel
In diesem Beispiel verwendet die Klasse c1 die Klasse c2 und umgekehrt. Deshalb muss eine der Klassen vor ihrer eigentlichen Definition bekannt gemacht werden.
CLASS c1 DEFINITION DEFERRED.
CLASS c2 DEFINITION.
PUBLIC SECTION.
DATA c1ref TYPE REF TO c1.
ENDCLASS.
CLASS c1 DEFINITION.
PUBLIC SECTION.
DATA c2ref TYPE REF TO c2.
ENDCLASS.
Mit DEFERRED wird die Klasse zwar bekannt, allerdings ist der Zugriff auf Komponente wie es in der Dokumentation beschrieben wird nicht möglich.ST22 hat geschrieben: ↑30.08.2020 15:51Was meinst du genau geht nicht?
https://help.sap.com/doc/abapdocu_751_i ... %20machen.Code: Alles auswählen.
Beispiel In diesem Beispiel verwendet die Klasse c1 die Klasse c2 und umgekehrt. Deshalb muss eine der Klassen vor ihrer eigentlichen Definition bekannt gemacht werden. CLASS c1 DEFINITION DEFERRED. CLASS c2 DEFINITION. PUBLIC SECTION. DATA c1ref TYPE REF TO c1. ENDCLASS. CLASS c1 DEFINITION. PUBLIC SECTION. DATA c2ref TYPE REF TO c2. ENDCLASS.
black_adept hat geschrieben: ↑30.08.2020 22:41Könntest du mal den Code posten der deiner Meinung nach nicht funktioniert. M.E. sollten die beiden Klassen sich gegenseitig verwenden können. Das Einzige woran ich mich erinnere dass es nicht funktioniert ist, dass die beiden Klassen in ihrem jeweiligen Deklarationsteil nicht die Deklarationen der anderen Klasse verwenden können sondern nur die später definierte Klasse die der früher definierten. Allerdings ist das auch in der Doku vermerkt - blöd ist es trotzdem.
Code: Alles auswählen.
CLASS lcl_chart_controller DEFINITION DEFERRED.
CLASS lcl_alv_controller DEFINITION.
...
METHODS get_chart_controller RETURNING VALUE(ro_chart_controller) TYPE REF TO lcl_chart_controller.
METHODS double_click_handler FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row
e_column.
ENDCLASS.
CLASS lcl_alv_controller IMPLEMENTATION.
METHOD get_chart_controller.
ro_chart_controller = mo_chart_controller. "Wird dann im Konstruktor gesetzt
ENDMETHOD.
METHOD double_click_handler.
DATA lo_chart_controller type ref to lcl_chart_controller.
lo_chart_controller = get_chart_controller( ).
*!!!!!!! Hier versuche ich jetzt eine Methode aufzurufen z.B.
lo_chart_controller->test( ).
*Diese Methode ist 100% public, lo_chart_controller existiert im Debugger und ist *nicht initial. Das Objekt wird also richtig übergeben. Allerdings sind die Methoden *laut Error-Code unbekannt!
ENDMETHOD.
ENDCLASS.
CLASS lcl_chart_controller DEFINITION.
...
init_alv.
ENDCLASS.
CLASS lcl_chart_controller IMPLEMENTATION.
METHODS init_alv.
*Hier wird dann die Klasse lcl_alv_controller instantiiert
* Es wird ein ALV Grid vorbereitet und angezeigt
* Dem Objekt wird die Instanz dieser Klasse also me mitgegeben
...
ENDMETHOD.
ENDCLASS.
Code: Alles auswählen.
CLASS lcl_chart_controller DEFINITION.
...
init_alv.
ENDCLASS.
CLASS lcl_alv_controller DEFINITION.
...
METHODS get_chart_controller RETURNING VALUE(ro_chart_controller) TYPE REF TO lcl_chart_controller.
METHODS double_click_handler FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row
e_column.
ENDCLASS.
CLASS lcl_chart_controller IMPLEMENTATION.
...
ENDCLASS.
CLASS lcl_alv_controller IMPLEMENTATION.
...
ENDCLASS.
Folgende Benutzer bedankten sich beim Autor jocoder für den Beitrag (Insgesamt 2):
abapnewbie • generic_user
Vielen Dank, unglaublich dass die Antwort so naheliegend war. Fälschlicherweise nahm ich immer an, dass die Implementation direkt nach der Definition folgen muss. Dem ist scheinbar nicht so. Die Methoden der Klasse werden nun richtig angezeigt und können aufgerufen werden.jocoder hat geschrieben: ↑31.08.2020 08:58Am besten die Definition aller lokaler Klassen zuerst erstellen und danach erst die Implementierungen.
In deinem Beispiel:Im Implementierungsteil sind dann alle lokale Klassen bereits bekannt.Code: Alles auswählen.
CLASS lcl_chart_controller DEFINITION. ... init_alv. ENDCLASS. CLASS lcl_alv_controller DEFINITION. ... METHODS get_chart_controller RETURNING VALUE(ro_chart_controller) TYPE REF TO lcl_chart_controller. METHODS double_click_handler FOR EVENT double_click OF cl_gui_alv_grid IMPORTING e_row e_column. ENDCLASS. CLASS lcl_chart_controller IMPLEMENTATION. ... ENDCLASS. CLASS lcl_alv_controller IMPLEMENTATION. ... ENDCLASS.