dyn. Methodenaufruf, SUPER vs. KIND

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

dyn. Methodenaufruf, SUPER vs. KIND

Beitrag von Icke0801 (Specialist / 126 / 97 / 7 ) »
Hallo zusammen,

ich sehe mal wieder den Wald vor lauter Bäumen nicht.

gegeben sind Superklasse und Kindklasse.


Im Super-> Constructor lese ich mir alle Methoden ein:
In me-> steht die Referenz auf die Kindklasse. Damit lese ich alle geerbeten und eigenen Methoden ein --> klappt.

Code: Alles auswählen.

" Methoden sammeln
    ref_help->read_methods( ref = me ).

Warum klappt dann folgendes im Super->Constructor nicht?
Exception "CX_SY_DYN_CALL_ILLEGAL_METHOD" wird geworfen."

Code: Alles auswählen.

    LOOP AT ref_help->atr_zif_methods ASSIGNING <fs_methods>.
      CONCATENATE <fs_methods>-ifname <fs_methods>-methodname
      INTO methode SEPARATED BY '~'.
      CALL METHOD me->(methode).
    ENDLOOP.
Ich würde gerne das abloopen der Methoden zentral händeln, anstatt in etlichen KIND->Constructor immer denselben Code zu implementieren.

Hat jemand nen Tipp dazu?
--
Grüße aus der Endlosschleife
-= Icke =-
abapTools

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


Re: dyn. Methodenaufruf, SUPER vs. KIND

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
Bau dir eine Methode, die "das Abloopen der Methoden" macht.

Verwende Design Pattern Factory:
In der Factory-Methode erzeugst du deine Klasse und rufst dann explizit die o.a. Methode auf. Da diese nun im Kontext von "me" läuft solltest du alles bekommen was du benötigst.

Code: Alles auswählen.

REPORT.

CLASS parent DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS: factory RETURNING VALUE(ro_parent) TYPE REF TO parent.
    METHODS: test.

ENDCLASS.

CLASS child DEFINITION INHERITING FROM parent.
  PUBLIC SECTION.
    METHODS:child_test.
ENDCLASS.

START-OF-SELECTION.
  DATA: test TYPE REF TO child.

  test ?= parent=>factory( ).

CLASS parent IMPLEMENTATION.

  METHOD test.
    DATA: methname TYPE string.
    methname = 'CHILD_TEST'.
    CALL METHOD me->(methname).
  ENDMETHOD.

  METHOD factory.
    CREATE OBJECT ro_parent TYPE child.
    ro_parent->test( ).
  ENDMETHOD.

ENDCLASS.

CLASS child IMPLEMENTATION.
  METHOD child_test.
    break-point.
  ENDMETHOD.

ENDCLASS.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: dyn. Methodenaufruf, SUPER vs. KIND

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
Im SUPER->CONSTRUCTOR hat man leider nur Zugriff auf die Methoden und Attribute der SUPER-Klasse und nicht der KIND-Klassen auch wenn der SUPER->CONSTRUCTOR vom KIND aufgerufen wurde.
Ich weis jetzt nicht ob das eine Einschränkung nur von ABAP ist oder von OO selbst, sprich, dass es dieses Verhalten auch z.B. in Java gibt.
Hat mir auch schon manches mal des letzten Nerv gekostet, dass man da nicht auf die KIND-Elemente zugreifen kann. Ist glaub ich auch in der Hilfe zu SUPER beschrieben.

lg ADT
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: dyn. Methodenaufruf, SUPER vs. KIND

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
Das geht sogar soweit, als dass abgleitete Methoden der KIND-Klasse im Constructor der SUPER-Klasse ebenfalls ignoriert werden.
Wenn es also darum geht, denselben immer wiederkehrenden Code zu vermeiden hab ich mir dadurch beholfen, das Ganze in eine eigene Methode zu packen und im Constructor der KIND-Klasse aufzurufen. Da der Constructor der SUPER-Klasse dann alleine nicht alles korrekt instanzieren kann, wird die ganze Klasse auf ABSTRACT gesetzt, damit niemals(!) eine Instanz der SUPER-Klasse ohne KIND-Klasse angelegt werden kann :wink:

EDIT: Gerade ausprobiert. In Java ist das Verhalten definitiv anders. Es scheint sich also um ein ABAP-spezifisches Verhalten zu handeln.
http://help.sap.com/saphelp_470/helpdat ... ontent.htm
Steht fast ganz unten auf der Seite:
ABAP-Hilfe hat geschrieben:In Konstruktoren sind die Methoden von Unterklassen nicht sichtbar. Falls ein Instanzkonstruktor eine Instanzmethode der gleichen Klasse über die implizite Selbstreferenz ME-> aufruft, wird die Methode so aufgerufen, wie sie in der Klasse des Instanzkonstruktors implementiert ist und nicht die eventuell redefinierte Methode der zu instantiierenden Unterklasse. Dies ist eine Ausnahme von der Regel, daß beim Aufruf von Instanzmethoden immer die Implementierung in der Klasse aufgerufen wird, auf deren Instanz die Referenz gerade zeigt.
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: dyn. Methodenaufruf, SUPER vs. KIND

Beitrag von Icke0801 (Specialist / 126 / 97 / 7 ) »
black_adept hat geschrieben:Bau dir eine Methode, die "das Abloopen der Methoden" macht.

Verwende Design Pattern Factory:
In der Factory-Methode erzeugst du deine Klasse und rufst dann explizit die o.a. Methode auf. Da diese nun im Kontext von "me" läuft solltest du alles bekommen was du benötigst.
Ich habe doch schon die Instanz.

Was mich erstmal wundert.
Im SUPER->Constructor ist bei read_methods die Referenz ok, aber 5 Zeilen tiefer bei call method dann nicht mehr?
--
Grüße aus der Endlosschleife
-= Icke =-
abapTools

Re: dyn. Methodenaufruf, SUPER vs. KIND

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
Das ist leider so. Nimm es einfach als gegeben.

Pack das "händeln" der Methoden in eine eigene (protected) Methode der SUPER-Klasse und rufe diese im CONSTRUCTOR der KIND-Klasse auf.
Das ist die einzige Möglichkeit die ich kenne, damit das funktioniert was du vor hast.
So ist zumindest die Menge an Code die du in jeder KIND-Klasse einbauen musst, überschaubar gering.

Lg ADT

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

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: dyn. Methodenaufruf, SUPER vs. KIND

Beitrag von Icke0801 (Specialist / 126 / 97 / 7 ) »
a-dead-trousers hat geschrieben:Das ist leider so. Nimm es einfach als gegeben.
Ja, bleibt leider nix anderes übrig. :twisted:
a-dead-trousers hat geschrieben:Pack das "händeln" der Methoden in eine eigene (protected) Methode der SUPER-Klasse und rufe diese im CONSTRUCTOR der KIND-Klasse auf.
Das ist die einzige Möglichkeit die ich kenne, damit das funktioniert was du vor hast.
So ist zumindest die Menge an Code die du in jeder KIND-Klasse einbauen musst, überschaubar gering.
Ich habe das gestern mal testweise in eine Factory-Klasse gepackt. Erste kurze Tests haben funktioniert. Damit würde der Aufwand noch geringer, nämlich zentral an einer Stelle.
Zumindest ist das "Problem" bis hierher erstmal gelöst.

Vielen Dank :up:
--
Grüße aus der Endlosschleife
-= Icke =-
abapTools

Re: dyn. Methodenaufruf, SUPER vs. KIND

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
Falls jemand noch mal in der Doku genau nachlesen möchte warum das alles sich so verhält wie hier diskutiert:

( Vorletzter Absatz )
http://help.sap.com/saphelp_470/helpdata/de/dd/4049c40f4611d3b9380000e8353423/content.htm hat geschrieben:[...]
In Konstruktoren sind die Methoden von Unterklassen nicht sichtbar. Falls ein Instanzkonstruktor eine Instanzmethode der gleichen Klasse über die implizite Selbstreferenz ME-> aufruft, wird die Methode so aufgerufen, wie sie in der Klasse des Instanzkonstruktors implementiert ist und nicht die eventuell redefinierte Methode der zu instantiierenden Unterklasse. Dies ist eine Ausnahme von der Regel, daß beim Aufruf von Instanzmethoden immer die Implementierung in der Klasse aufgerufen wird, auf deren Instanz die Referenz gerade zeigt.
[...]
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Seite 1 von 1

Vergleichbare Themen

3
Antw.
2231
Views
Super BW-Forum
von mehmetalierbil » 17.05.2006 16:24 • Verfasst in Sonstige Module
1
Antw.
2428
Views
WebDynpro für Super-Dummis
von rmayr » 28.02.2007 10:09 • Verfasst in Web-Dynpro, BSP + BHTML
2
Antw.
3375
Views
Aufruf der super-Methode erzwingen
von ralf.wenzel » 19.01.2014 22:23 • Verfasst in ABAP Objects®
1
Antw.
754
Views
Aufruf redifinierter Methode im Super Konstruktor
von nickname8 » 07.03.2021 13:31 • Verfasst in ABAP Objects®
4
Antw.
19908
Views
Dynamischer Methodenaufruf
von Cola » 20.08.2009 14:55 • Verfasst in ABAP Objects®

Ü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

Aktuelle Forenbeiträge

Regex in where
vor einer Stunde von tar 6 / 103
Programm anlegen mit Vorlage
vor 16 Stunden von DeathAndPain 2 / 118
IT0024 Qualifikationen CP-ID
vor 16 Stunden von DeathAndPain 2 / 353
BUSOBJEKT zu CMIS PHIO ermitteln
vor 18 Stunden von snooga87 1 / 86

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

Regex in where
vor einer Stunde von tar 6 / 103
Programm anlegen mit Vorlage
vor 16 Stunden von DeathAndPain 2 / 118
IT0024 Qualifikationen CP-ID
vor 16 Stunden von DeathAndPain 2 / 353
BUSOBJEKT zu CMIS PHIO ermitteln
vor 18 Stunden von snooga87 1 / 86

Unbeantwortete Forenbeiträge

BUSOBJEKT zu CMIS PHIO ermitteln
vor 18 Stunden von snooga87 1 / 86
aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9821