Code: Alles auswählen.
DATA(object_ref) = cl_abap_typedescr=>describe_by_object_ref( lo_object ).
DATA(class_desc) = CAST cl_abap_classdescr( object_ref ).
READ TABLE class_desc->methods ASSIGNING FIELD-SYMBOL(<method>)
WITH KEY name = 'GET_MACHWAS'.
IF sy-subrc = 0.
CALL METHOD lo_object->(<method>-name)
RECEIVING
result = result.
ELSE.
BREAK-POINT.
ENDIF.
Code: Alles auswählen.
case type of lo_object.
when type ZIF_INTERFACE into data(lr_interface).
result = lr_interface->get_machwas( ).
when others.
BREAK-POINT.
endcase.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Icke0801
Die Klassen haben über 20 Interfaces. Deswegen bin ich diesen Weg gegangen. Die Methoden unterscheiden sich vom Namen und den Typen des Returning Parameters.a-dead-trousers hat geschrieben: ↑30.04.2022 10:28
Sofern du deine Methoden damit verwaltest, kannst du beliebige Objekte verwenden und hast dennoch immer Zugriff darauf ohne auf RTTI oder andere dynamische Ansätze zurückzugreifen.
Der Ansatz mit CASE TYPE OF gefällt mir insofern am besten, als man damit in der 7.50er Syntax gleich mit Inline-Deklarationen eine Variable erzeugen kann und man muss sich nicht um die mögliche Exception bei einem gewöhnlichen Casting ( ?= ) kümmern. Außerdem prüft das Konstrukt auch ob lo_object überhaupt existiert und somit fällt auch ein zusätzliches IF ... IS BOUND bzw. IF ... IS NOT INITIAL weg.
Ich muss ja herausfinden, welcher Type gerade am Wickel ist. Im DDIC sind die natürlich hinterlegt. Über cl_abap_classdescr bekomme ich diese Info aber leider nicht.a-dead-trousers hat geschrieben: ↑30.04.2022 10:28EDIT:
Was den Typen des Returning-Parameters angeht, kannst du diesen ja entweder im Interface oder im DDIC definieren und kannst somit global darauf zugreifen.
Das ist dann eh perfekt für CASE TYPE OF.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Icke0801
Du hast also eine Klasse mit n Interfaces und weißt nicht, aus welchem Interface du die Methode aufrufst? Das halte ich für einen grundsätzlichen Designfehler. Ein Interface beschreibt eine Eigenschaft einer Klasse bzw. des daraus resultierenden Objektes und der Kontext des Aufrufes muss zu eben dieser Eigenschaft passen. Wenn du das bedenkst, löst sich dein Problem von selbst.
Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
Icke0801
Wer sagt denn sowas? Mein Problem siehe Linkralf.wenzel hat geschrieben: ↑01.05.2022 15:17Du hast also eine Klasse mit n Interfaces und weißt nicht, aus welchem Interface du die Methode aufrufst? Das halte ich für einen grundsätzlichen Designfehler.
Von welchem Typ ist denn lo_object?Icke0801 hat geschrieben: ↑30.04.2022 08:28Code: Alles auswählen.
DATA(object_ref) = cl_abap_typedescr=>describe_by_object_ref( lo_object ). DATA(class_desc) = CAST cl_abap_classdescr( object_ref ). READ TABLE class_desc->methods ASSIGNING FIELD-SYMBOL(<method>) WITH KEY name = 'GET_MACHWAS'. IF sy-subrc = 0. CALL METHOD lo_object->(<method>-name) RECEIVING result = result. ELSE. BREAK-POINT. ENDIF.
Du sagst so etwas indirekt. Wenn du nur ein Interface mit genau dieser Methode hättest, würdest du diese auch "normal" ausführen.Icke0801 hat geschrieben: ↑02.05.2022 06:12Wer sagt denn sowas? Mein Problem siehe Linkralf.wenzel hat geschrieben: ↑01.05.2022 15:17Du hast also eine Klasse mit n Interfaces und weißt nicht, aus welchem Interface du die Methode aufrufst? Das halte ich für einen grundsätzlichen Designfehler.
Das ist doch gar nicht mein Problem.
Dazu habe ich folgende Fragen:
wie komme ich an den Typen des Returning-Parameters (Inline Deklaration funktioniert hier nicht)
Warum kann ich nicht auf die Interface Methoden ('ZIF_INTERFACE~GET_MACHWAS') zugreifen?
Der Read Table geht nur mit 'GET_MACHWAS'
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Icke0801
Und Ralf, msfox sowie meine Wenigkeit versuchen dir verständlich zu machen, dass du einen völlig falschen Ansatz verfolgst.Icke0801 hat geschrieben: ↑02.05.2022 11:34Das ist doch gar nicht mein Problem.
Es geht hier um:Dazu habe ich folgende Fragen:
wie komme ich an den Typen des Returning-Parameters (Inline Deklaration funktioniert hier nicht)
Warum kann ich nicht auf die Interface Methoden ('ZIF_INTERFACE~GET_MACHWAS') zugreifen?
Der Read Table geht nur mit 'GET_MACHWAS'
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Icke0801