Redefinition Methode in lokaler Klasse

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

Redefinition Methode in lokaler Klasse

Beitrag von olli-x (Specialist / 166 / 0 / 1 ) » 30.01.2007 14:11
Hallo zusammen,

ich habe gerade ein Problem mit der Redefinition einer Methode...

Ich habe in einem Report eine lokale Klasse "LCL_ALV".
Diese Klasse hat einen Konstruktor, in dem versch. geschützte(protected) Methoden aufgerufen werden - u.a. SET_DATA( ).

Von dieser Klasse habe ich eine weitere Klasse abgeleitet "LCL_ALV_DETAIL"
Die Methode SET_DATA( ) habe ich in der Subklasse redefiniert und im Rumpf mit Super-> die Methode der Superklasse aufgerufen...
Für die Subklasse habe ich keinen eigenen Konstruktor geschrieben, weil der Konstruktor der Superklasse alles benötigte leistet...

Wenn ich nun mein Programm im Debugger beobachte wird bei Objekterzeugung der Subklasse der Konstruktor der Superklasse aufgerufen, darin erfolgt der Aufruf der Methode SET_DATA( ) - allerdings wird der Quellcode der Superklasse prozessiert und NICHT die Redefinition meiner Subklasse !?!?!!

Habe ich ein Verständnisproblem - was läuft hier falsch?

Ich würde mich freuen, wenn ich schnell Antwort bekomme - ES EILT !!!!

Vielen Dank.

Gruß,
Oliver


Beitrag von DeathGuardian (Expert / 759 / 0 / 2 ) » 30.01.2007 15:25
Hab ich dich richtig verstanden?
- Du erzeugst ein Object deiner Subklasse.
- Der Constrkctor deiner Subklasse ruft den SUPER-Construktor.
- Und nun soll dieser SUPER-Construktor die Methode deiner Subklasse aufrufen??????

Ich würd sagen du hast ein Verständnisproblem.

Beitrag von olli-x (Specialist / 166 / 0 / 1 ) » 30.01.2007 15:34
Hi,

die Subklasse hat keinen explitziten Konstruktor.
Also wird der Konstruktor der Superklasse gezogen...
Innerhalb des Konstruktors wird mit me->set_data( ) die entsprechende Methode aufgerufen.

Ich hatte angenommen, das ich mich, dadurch das ich den Konstruktor nicht mit "super" aufrufe auf der "Ebene der Subklasse" befinde (wegen Vererbung) und die Redefinition gezogen wird...

Ich lag wohl daneben was?

Gruß,
Olli

Beitrag von ereglam (Top Expert / 1826 / 0 / 5 ) » 30.01.2007 15:55
Hallo Olli,

lege mal einen Konstruktor Deiner Unterklasse an, der den Konstruktor der Superklasse (mit super->constructor() ) aufruft.

Es liegt möglicherweise daran, dass die Instanz zu deiner Unterklasse noch nicht instanziiert wurde und daher der me->set_data() deshalb falsch gezogen wird...
Wenn nicht, musst Du im Unterklassenkonstruktor set_data() explizit aufrufen.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .
Mitglied im XING

Beitrag von olli-x (Specialist / 166 / 0 / 1 ) » 30.01.2007 16:16
Hallo ereglam,

genau das hatte ich gerade gemacht :?
Allerdings mit einem weinenden Auge...

Durch den Aufruf des Konstruktors mit super-> in der Superklasse, befinde ich mich auch in der Superklasse und dann hab ich das Szenario das DeathGuardian meinte...

Dann muss ich anschließend die Methode set_data( ) erneut aufrufen, damit sie aus der Unterklasse gezogen wird... Das führt dazu, das ich versch. Methoden, die erst nach set_data( ) aufgerufen werden können im Konstruktor der Unterklasse ebenfalls erneut aufrufen muss... :x

Wie sieht es denn jetzt eigentlich mit meinem Verständnis aus?
Da ich in der Unterklasse keinen eigenen Konstruktor definiert habe, dachte ich, das über die Vererbung der Quellcode der Superklasse gezogen- und als Konstruktor der Unterklasse ausgeführt wird und somit die Methodenaufrufe im Konstruktor mit "me->...( ) "auch wirklich "in der Unterklasse" ausgeführt werden...
Sei es, das die Methoden unverändert über Vererbung kommen oder Redefiniert wurden...

Ist diese Annahme grundsätzlich falsch ?
Oder klappt das bei SAP nicht? Vielleicht weil es lokale Klassen sind?

Viele Grüße,
Olli

Beitrag von Flo (Specialist / 161 / 0 / 0 ) » 30.01.2007 17:19
Hier hab ich noch was schönes aus der SAP Hilfe dazu:
1.:
In Oberklassen, die keinen explizit definierten Instanz-Konstruktor haben, wird der implizit immer vorhandene Instanz-Konstruktor ausgeführt. Dieser sorgt automatisch für den Aufruf des Instanz-Konstruktors der nächsthöheren Oberklasse.

und 2.:
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.

Beitrag von Olli (ForumUser / 3 / 0 / 0 ) » 30.01.2007 17:31
Hallo Flo,

1000 Dank für den Hinweis.
Ich bin mit der Fragestellung gar nicht auf die Idee gekommen in die Hilfe zu schauen :oops:
Dies ist eine Ausnahme von der Regel,
:lol: war wieder klar das ich genau passend zur Ausnahme kodiere :lol:

Weil ich den Hals mal wieder nicht voll kriege:
Ist das an dieser Stelle eigentlich IMMER so ( also auch bei Java, C#, ...) , oder handelt es sich hier um eine Eigenart von ABAP?
Weiß das vielleicht jemand, ansonsten probiere ich das irgendwann mal aus...

Nochmal vielen Dank für alle Antworten.

Viele Grüße,
Olli

Beitrag von Flo (Specialist / 161 / 0 / 0 ) » 30.01.2007 17:32
Nun noch ein Hinweis wie man das ganze einigermassen sauber gelöst bekommt:

In der Superklasse legt man eine Methode Initialize( ) an die die Initialisierungen der Superklasse durchführen soll. z.B. Aufruf von set_data( ). (Die Superklasse hat keinen Constructor der zum Aufruf von set_data führt)

In der Subklasse ruft man im Constructor den super->constructor und danach Initialize( ) (Kann man überdefinieren muss man aber nicht) Wenn man nun set_data überdefiniert hat wird die set_data der Subklasse aufgerufen.
=>saubere Lösung ohne doppelte Aufrufe.

Beitrag von olli-x (Specialist / 166 / 0 / 1 ) » 30.01.2007 17:53
Hallo Flo,

danke für die Idee - je mehr ich darüber nachdenke, umso besser gefällts mir.
Ich denke so in der Art werd ich das umbasteln. :D

Viele Grüße,
Olli

Seite 1 von 1

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und besseren Inhalt:

Vergleichbare Themen

Komplette Klasse in Lokaler datei sichern
von SwordMaster » 11.04.2007 14:21
Methode einer Klasse: zugehöriger NAME in der TRDIR
von Bernd » 24.06.2005 11:32
Klasse CL GUI FRONTEND SERVICES, Methode GUI DOWNLOAD
von L0w-RiDer » 27.08.2019 12:58
Klasse bzw. Methode zum anlegen eines Objektes
von Troopy » 04.08.2003 15:54
RC 8 Transport Klasse Methode existiert nicht
von c oco » 07.09.2018 09:54