Cast dynamisch

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

Cast dynamisch

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Moin,

gegeben sei ein Objekt, das ein Marker-INTF besitzt. Den Namen der Klasse des Objekts krieg ich raus, weiß ihn also (erst) zur Laufzeit. Was ich jetzt brauche, ist das komplette Objekt zu dem Klassennamen, der das INTF implementiert.

Halbwegs verständlich? Wie kriege ich das elegant hin?


Gruß

Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

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


Re: Cast dynamisch

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Ne, ganz verstehe ich dein Anliegen leider nicht.
Um auf die Attribute bzw. Methoden eines Objektes zuzugreifen muss man "nur" die Schnittstelle (= Klasse oder Interface) kennen. Da du ja die Klasse bereits hast, frage ich mich ist wozu du das "komplette Objekt zu dem Klassennamen" benötigst bzw. was du darunter verstehst?

EDIT:
Von der Threadüberschrift her könnte ich mir vorstellen, dass du einen Cast auf eine Klasse brauchst die du zur Designzeit (noch) nicht kennst. Wenn das wirklich der Fall ist, hast du meines Erachtens einen Fehler in deinem Klassendesign. Für solche Fälle gibt es ja die Interfaces. Damit gibt man die Schnittstelle für "unbekannte" Objekte vor. Wenn eine Klasse sich an die API andocken möchte muss sie als Vorraussetzung dieses Interface implementieren.

Nichtsdestotrotz bietet ABAP (als "pseudo" Script-Programmiersprache) die Möglichkeit von dynamischen Methodenaufrufen. Damit könnte man zur Laufzeit, ohne die Klasse zur Designzeit zu kennen einen Methoden-Aufruf programmieren. Die Informationen zu Methodenname und Parameter lassen sich über RTTI ermitteln. Das dass nicht unbedingt "schön" ist brauch ich wohl nicht extra zu erwähnen, aber selbst die SAP hat das für den neuen ABAP Debugger so gelöst:
Um ältere Releases zu unterstützen wird bei nicht Vorhandensein der Klasse CL_DYNPRO_SPLITTER auf eine Fallback-Implementierung ausgewichen. Um trotzdem in neuen Releases die Funktionalität ohne Syntaxerrors in älteren Releases verwenden zu können, wurden alle Methodenaufrufe dieser Klasse dynamisch abgebildet.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
ewx

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Cast dynamisch

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
ralf.wenzel hat geschrieben:
10.12.2020 23:49
gegeben sei ein Objekt
ralf.wenzel hat geschrieben:
10.12.2020 23:49
Was ich jetzt brauche, ist das komplette Objekt
du hast es doch anscheinend schon...?!

Re: Cast dynamisch

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Nein, ich habe ein auf das INTF reduzierte Objekt und den Namen der Klasse. Das INTF ist ein reines Marker-INTF, das ich nicht ändern kann. Könnte ich das INTF ändern, wäre das kein Problem.

Im Prinzip müsste ich ein Up-Casting des Interface-Objektes machen auf ein Objekt, dessen Klassennamen zur Laufzeit kenne, weil über RTTI ermittelt.

Dass das doof ist, weiß ich.

Ich könnte ein Objekt instanziieren mit dem Klassennamen, dann ist das aber ein anderes Objekt. Ich will nur das bestehende per Upcast „erweitern“.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Cast dynamisch

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
wahrscheinlich möchtest du ja irgendwelche Methoden des Objektes aufrufen, die nicht in dem Interface vorhanden sind?

In etwa so?

Code: Alles auswählen.

INTERFACE if_marker.
ENDINTERFACE.

CLASS appl DEFINITION.
  PUBLIC SECTION.
    METHODS set IMPORTING intf TYPE REF TO if_marker.
ENDCLASS.

CLASS mainobj DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_marker.
    METHODS hello.
ENDCLASS.

CLASS appl IMPLEMENTATION.
  METHOD set.

    DATA upcast  TYPE REF TO object.
    upcast = CAST #( intf ).
    CALL METHOD upcast->('HELLO').

  ENDMETHOD.
ENDCLASS.


CLASS mainobj IMPLEMENTATION.
  METHOD hello.
    MESSAGE 'Hello' TYPE 'I'.
  ENDMETHOD.
ENDCLASS.


START-OF-SELECTION.

  DATA(myobj) = NEW mainobj( ).
  DATA(myappl) = NEW appl( ).
  myappl->set( myobj ).
Du musst in dem Fall nur wissen, welche Methoden das Hauptobjekt hat (und parameter natürlich).

also eigentlich genau das, was a-d-t bereits geschrieben hat, nur als Beispiel code... ;) Ich hatte mich eben auch gefragt, ob da nicht ein Designfehler vorliegt, habe mich aber nicht getraut. Aber da a-d-t das ähnlich sieht...

Re: Cast dynamisch

Beitrag von jocoder (Specialist / 338 / 3 / 101 ) »
INTF lassen sich auch schachteln. Wenn besagte Klasse änderbar ist, wäre das meine Lösung.

Code: Alles auswählen.

INTERFACE dummy_marker.

ENDINTERFACE.

INTERFACE hello_world_api.

  INTERFACES dummy_marker.

  METHODS hello.

ENDINTERFACE.

CLASS hello_world DEFINITION.

  PUBLIC SECTION.

    INTERFACES hello_world_api.

ENDCLASS.

CLASS hello_world IMPLEMENTATION.

  METHOD hello_world_api~hello.
    MESSAGE 'hello world' TYPE 'I'.
  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

  DATA(marker_impl) = CAST dummy_marker( NEW hello_world( ) ).

  DATA(upcasted) = CAST hello_world_api( marker_impl ).

  upcasted->hello( ).

Re: Cast dynamisch

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
nur dass hello_world_api eben anscheinend erst zur Laufzeit bekannt ist und dynamisch stattfinden soll...

Re: Cast dynamisch

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Das Problem ist, dass ich dann alle Klassen, die das INTF nutzen, ändern müsste, damit sie das umfassende INTF stattdessen nutzen. Wäre unschön, wir reden hier von zwei Dutzend Klassen.

Enno hatte um 12:34 recht -- ich hatte verschiedene Schreibweisen versucht aber die einfachste nicht. Aber das ist (aus der Ferne betrachtet, ich sitze gerade nicht am System). Der Witz ist: Ich weiß, wie die Methode heißt, die in allen Klassen implementiert wird. Ich müsste sie also nicht als Literal mitgeben, das muss ich wohl nur wegen der Syntaxprüfung.

Danke für eure Tips.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Cast dynamisch

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
ralf.wenzel hat geschrieben:
11.12.2020 12:56
Das Problem ist, dass ich dann alle Klassen, die das INTF nutzen, ändern müsste, damit sie das umfassende INTF stattdessen nutzen. Wäre unschön, wir reden hier von zwei Dutzend Klassen.
wenn es sich nur um eine Methode handelt, ist das doch aber kein Problem.
- Methode ins Interface einfügen
- 24 mal
-- code von Klassen-Methode in Interface-Methode kopieren
-- Klassenmethode löschen

Dafür ist es dann hinterher ordentlich.

Re: Cast dynamisch

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Und damit durch vier Abteilungen zentrale Entwicklungsobjekte blockieren bis zum nächsten Release und die Fachabteilungen sodann mit Tests nerven.

Nein, danke, meinen Tod habe ich mir deutlich weniger schmerzhaft vor 😂

Dann mache ich es lieber so, bereite die „schöne“ Lösung vor mit der Anleitung an die Kollegen, wie sie das umstellen, wenn sie das nächste Mal was ändern.


Ralf

Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
msfox

Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Seite 1 von 1

Vergleichbare Themen

2
Antw.
2338
Views
cast von hex zahlen
von francula » 21.07.2004 14:09 • Verfasst in ABAP® Core
2
Antw.
2580
Views
Dynamic Cast von Superclass auf Subclass
von AdrianSchm » 22.06.2018 11:03 • Verfasst in ABAP Objects®
0
Antw.
643
Views
Cast von dec20 nach char20 UNI-Code Probleme
von cut1 » 21.06.2006 10:41 • Verfasst in Basis
0
Antw.
689
Views
Cast von dec20 nach char20 UNI-Code Probleme
von cut1 » 21.06.2006 10:39 • Verfasst in Basis
1
Antw.
1240
Views
dynamisch Where???
von Jinn » 14.05.2004 02:13 • Verfasst in ABAP® Core

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

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.

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 107
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 140