Kommunikation zwischen zwei Klassen

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
8 Beiträge • Seite 1 von 1
8 Beiträge Seite 1 von 1

Kommunikation zwischen zwei Klassen

Beitrag von abapnewbie (ForumUser / 25 / 12 / 0 ) »
Hallo,

eine Sache die mich hin und wieder in ABAP irritiert, ist die Wichtigkeit der Reihenfolge von Klassen. Wenn ich zwei lokale Klassen A und B habe, die miteinander kommunizieren sollen, dann muss ich die Reihenfolge so festlegen, dass B vor A definiert wird, wenn Klasse A eine Instanz von Klasse B erzeugt.

In dem Fall kann ich aber gar nicht mehr von B nach A kommunizieren, weil B die Definition von A ja noch gar nicht kennt. Auch mit DEFERRED, kann ich die Methoden der Klasse nicht aufrufen.

Gibt es in ABAP wirklich keine Möglichkeit, dass ich direkt aus Klasse B mit einer Instanz die Methoden von Klasse A aufrufen kann?

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Kommunikation zwischen zwei Klassen

Beitrag von ST22 (Specialist / 279 / 43 / 41 ) »
Was 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.

Re: Kommunikation zwischen zwei Klassen

Beitrag von abapnewbie (ForumUser / 25 / 12 / 0 ) »
ST22 hat geschrieben:
30.08.2020 15:51
Was 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.
Mit DEFERRED wird die Klasse zwar bekannt, allerdings ist der Zugriff auf Komponente wie es in der Dokumentation beschrieben wird nicht möglich.

In meinem Fall passiert vereinfacht folgendes:

* Instanz von Klasse c2
-> im Laufe des Programmes wird c1 instantiiert und die Instanz von c2 übergeben
* In c1 soll nun mit der übergebenen Instanz c2 eine Public Methode von ihr ausgeführt werden

Hierbei entsteht das Problem, dass zwar das Objekt laut Debugger richtig übergeben wird, allerdings die Methoden unbekannt sind und nicht ausgeführt werden können.

Deswegen verwundert es mich, dass ich zwar das Objekt übergeben kann aber seine Methoden nicht aufrufen kann. Laut Error-Message in Eclipse ist dann die Methode unbekannt, Private oder Protected.

Warum funktioniert das nicht bzw. wie kann ich erreichen, dass ich innerhalb von c1 mit der Referenz von c2 ihre Methoden aufrufen kann?

Re: Kommunikation zwischen zwei Klassen

Beitrag von abapnewbie (ForumUser / 25 / 12 / 0 ) »
Nachtrag:

Ich habe das ganze jetzt mal mit einem Event versucht und kann dadurch mein Ziel erreichen. Wenn man hier wie im Beispiel in der Klasse c2 ein Event deklariert und entsprechend in der Klasse c1 einen Handler für dieses Event erstellt, springt man dann in den Context von c1. Dort kenne ich ja mein Objekt und kann entsprechend die Methoden anstoßen. Die Datenübergabe erfolgt dann über entsprechende Parameter.

Das funktioniert zwar, gefällt mir aber nicht. Besonders weil ich bereits in einem Event-Handler ein anderes Event anstoße um lediglich in den Kontext zu gelangen.

Ich verstehe nicht ganz, warum ich das Objekt einer anderen Klasse übergeben aber seine Methoden nicht aufrufen kann, nur weil diese im Quellcode darunter liegen? Das funktioniert doch in anderen OO-Sprachen gut, z.B. Java? Was habe ich denn überhaupt davon, die Implementierung als DEFERRED zu kennzeichnen, wenn ich dadurch nur ein Objekt deklarieren kann und diese weder instantiieren noch seine Methoden aufrufen kann?

Es müsste doch eine Möglichkeit geben, bidirektional zwischen zwei Lokalen Klassen zu kommunizieren, sodass die im Quellcode früher geschriebene Klasse die Methoden der unteren Klasse aufrufen kann.

Macht ihr das auch über Events oder gibt es hier eine andere Vorgehensweise, die ich übersehe?

Re: Kommunikation zwischen zwei Klassen

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
Kö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.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Kommunikation zwischen zwei Klassen

Beitrag von abapnewbie (ForumUser / 25 / 12 / 0 ) »
black_adept hat geschrieben:
30.08.2020 22:41
Kö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.
Hallo, vielen Dank für die Antwort! Leider habe ich gerade keinen Zugriff auf den Quellcode, allerdings habe ich hier versucht sinnbildlich die Situation nachzustellen. Ich glaube die wichtigsten Informationen sind mit drin um das Problem zu verstehen.
Der Zugriff erfolgt eigentlich auch gar nicht in Definitionsteilen. Mir geht es darum, dass z.B. bei einem Doppelklick-Event aus der ALV Daten in der darunter liegenden Klasse verändert werden. Leider kann ich aber auf gar keine Methode zugreifen, obwohl das Objekt eigentlich soweit in Ordnung ist.

Vielleicht macht ich ja hier was falsch?

Re: Kommunikation zwischen zwei Klassen

Beitrag von jocoder (Specialist / 343 / 3 / 102 ) »
Am besten die Definition aller lokaler Klassen zuerst erstellen und danach erst die Implementierungen.
In deinem Beispiel:

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.
Im Implementierungsteil sind dann alle lokale Klassen bereits bekannt.

Folgende Benutzer bedankten sich beim Autor jocoder für den Beitrag (Insgesamt 2):
abapnewbiegeneric_user


Re: Kommunikation zwischen zwei Klassen

Beitrag von abapnewbie (ForumUser / 25 / 12 / 0 ) »
jocoder hat geschrieben:
31.08.2020 08:58
Am besten die Definition aller lokaler Klassen zuerst erstellen und danach erst die Implementierungen.
In deinem Beispiel:

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.
Im Implementierungsteil sind dann alle lokale Klassen bereits bekannt.
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.

Seite 1 von 1

Vergleichbare Themen

23
Antw.
15815
Views
Kommunikation von Klassen und Methoden
von Abapsocke » 14.08.2018 14:25 • Verfasst in ABAP® für Anfänger
8
Antw.
9056
Views
Architektur von Abap-Klassen (Klassen Attribute)
von snooze » 12.04.2005 12:56 • Verfasst in ABAP Objects®
20
Antw.
2672
Views
Globale Klassen oder Lokale Klassen
von ZF_SAPler » 29.11.2022 13:47 • Verfasst in ABAP® für Anfänger
9
Antw.
5438
Views
Lokale Klassen in globalen Klassen
von ralf.wenzel » 20.04.2020 22:55 • Verfasst in ABAP Objects®
3
Antw.
7974
Views
HTTP Kommunikation
von macjam » 04.10.2010 10:09 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag



Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
vor 2 Tagen von Bright4.5 1 / 753
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2377
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8962