Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

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).
20 Beiträge • Seite 1 von 2 (current) Nächste
20 Beiträge Seite 1 von 2 (current) Nächste

Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von SAP_Coder (ForumUser / 23 / 5 / 2 ) »
Hallo OO-Experten,

ich habe eben ein kleines Testprogramm geschrieben, dessen Verhalten mich wundert. Ich habe ganz sicher einen Denkfehler, auf diesen muss ich aber gestoßen werden. :)

Folgendes: Ich habe 2 Klassen, lcl_base als Basisklasse, lcl_doc als Unterklasse, die von lcl_base erbt. lcl_doc implementiert ein Interface if_interface.

Nun möchte ich in Unterklasse lcl_doc eine Methode der Basisklasse aufrufen, was an sich auch problemlos funktioniert, nur bekomme ich hier "falsche" Werte zurückgeliefert.

Beispiel: lo_base->set_value( 2 ). " setzt mv_value auf 2.

lo_doc->if_interface~get_data( ). " ruft Methode get_value in lo_base auf, statt der erwarteten 2 wird aber 0 zurückgeliefert.

Und eben das verstehe ich nicht, warum bekomme ich nicht den korrekten Wert, der im Attribut von lo_base steht?

Ich hoffe, ich habe mich verständlich ausgedrückt, falls nicht, kann ich gerne mein kleines Testprogrämmchen hier hereinstellen.

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


Re: Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von SAP_Coder (ForumUser / 23 / 5 / 2 ) »
Da ich immer noch an dem Problem herumtüftle und gerne verstehen würde, was hier falsch läuft, kopiere ich mein kleines Testprogramm mal hier rein, vielleicht kann einer der Experten mal drüber schauen. :)


*&---------------------------------------------------------------------*
*& Report Y_CLS
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT Y_CLS.

INTERFACE if_interface.
METHODS: get_data.

ENDINTERFACE.

CLASS lcl_base DEFINITION.
PUBLIC SECTION.

METHODS set_value IMPORTING iv_value type i.
METHODS get_value RETURNING VALUE(rv_value) TYPE i.

PRIVATE SECTION.
DATA:
mv_value type i.

ENDCLASS.

CLASS lcl_base IMPLEMENTATION.

METHOD set_value.
mv_value = iv_value.
ENDMETHOD.

METHOD get_value.
rv_value = mv_value.

ENDMETHOD.


ENDCLASS.


CLASS lcl_doc DEFINITION INHERITING FROM lcl_base.

PUBLIC SECTION.
INTERFACES: if_interface.

METHODS: get_value REDEFINITION.

ENDCLASS.

CLASS lcl_doc IMPLEMENTATION.
METHOD if_interface~get_data.
data: lv_data type i.

lv_data = get_value( ).

ENDMETHOD.

METHOD get_value.
super->get_value( ).

ENDMETHOD.

ENDCLASS.


CLASS lcl_doc2 DEFINITION INHERITING FROM lcl_base.

PUBLIC SECTION.

METHODS: get_value REDEFINITION.

ENDCLASS.

CLASS lcl_doc2 IMPLEMENTATION.
METHOD get_value.
data: lv_data type i.

lv_data = super->get_value( ).

ENDMETHOD.

ENDCLASS.




START-OF-SELECTION.

DATA: lo_base type REF TO lcl_base.
DATA: lo_doc type REF TO lcl_doc.
DATA: lo_doc2 type REF TO lcl_base.

DATA: lv_value type i.

CREATE OBJECT lo_base.
CREATE OBJECT lo_doc.
CREATE OBJECT lo_doc2 TYPE lcl_doc2.



lo_base->set_value( 2 ).

"lv_value = lo_doc->if_interface~get_data( ).



lv_value = lo_doc2->get_value( ).
WRITE lv_value. " Ergebnis sollte 2 sein, ist aber 0

lv_value = lo_base->get_value( ).
WRITE lv_value. " Ergebnis ist 2.

Re: Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Das ist einer Grundlagen von OO:
lo_base, lo_doc und lo_doc2 sind jeweils eigenständige Objekte mit eigenständigen Ausprägungen von mv_value. Wenn du den Wert in lo_doc änderst wird der Wert in lo_base nicht verändert, was ja der Sinn der Kapselung in OO ist.

Willst du auf dieselbe Variable zugreifen und verändern musst du diese allen Instanzen als Klassenattribut (class-data) zugänglich machen. Aber das sollte man nur sehr sparsam verwenden. Gehts es wirklich nicht ohne, hat man meistens eher einen Fehler im Klassendesign.
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: Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von SAP_Coder (ForumUser / 23 / 5 / 2 ) »
Wenn du den Wert in lo_doc änderst wird der Wert in lo_base nicht verändert, was ja der Sinn der Kapselung in OO ist.
Das ist mir bewusst und das will ich auch gar nicht. Ich möchte einfach den Wert mv_value aus lo_base per Get_Value bekommen, der eben auch im Attribut von lo_base steht. Und da stehe ich auf dem Schlauch, wieso das nicht geht.

Re: Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von Thomas R. (Expert / 754 / 73 / 34 ) »
a-dead-trousers hat es bereits geschrieben:
lo_base und lo_doc2 sind zwei verschiedene Instanzen. Sie haben keine Speicherbereiche gemeinsam (außer Klassenattribute in lcl_base).

MfG
Thomas R.

Re: Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von RaCDigger (ForumUser / 42 / 4 / 7 ) »
Hallo SAPCoder,

Dein Problem ist, du erzeugst in deinem Test Programm verschiedene Instanzen und versuchst aber dann über super-> auf eine andere Instanz zu zugreifen.

CREATE OBJECT lo_base.
CREATE OBJECT lo_doc.

in der lo_base wird zwar der Wert auf 2 gesetzt, aber diese Instanz ist nicht die in deinem super-> Aufruf.

Wenn du in deiner lo_doc Instanz auf Werte in deiner super klasse zugreifen willst musst du diese auch innerhalb deiner lo_doc instanzieren
super->constructor.

Dann kann du auch mit super->get_value auf die Werte (dieser Instanz) zugreifen.

Viele Grüße
Sven

Re: Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von SAP_Coder (ForumUser / 23 / 5 / 2 ) »
lo_base und lo_doc2 sind zwei verschiedene Instanzen. Sie haben keine Speicherbereiche gemeinsam (außer Klassenattribute in lcl_base).
Das ist mir bewußt. Und darum geht es mir auch gar nicht. Ich möchte aus der Unterklasse eine Methode der Basisklasse aufrufen, die den Wert des Attributes aus der Basisklasse zurückliefert.
Wenn du in deiner lo_doc Instanz auf Werte in deiner super klasse zugreifen willst musst du diese auch innerhalb deiner lo_doc instanzieren
super->constructor.
Ich denke, das ist der für mich entscheidende Hinweis. Das mit dem Super-> war allerdings nur ein Test und soll normalerweise nicht so sein, der eigentliche Gedanke ist, einfach die "Get_Value" Methode der Basisklasse in der Unterklasse aufzurufen, ohne diese zu redefinieren.

Wenn ich Deine Aussage richtig verstehe, muss ich, um auf Attribute der Basisklasse in der Unterklasse zugreifen zu können, immer den Constructor der Basisklasse noch einmal explizit aufrufen?

Re: Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von Thomas R. (Expert / 754 / 73 / 34 ) »
Du setzt mit lo_base->set_value( 2 ) in der Instanz lo_base das Attribut mv_value auf 2.
Die Instanz lo_doc2 wird davon nicht berührt. Deshalb ist dort mv_value immer noch 0 und du liest mit lo_doc2->get_value( ) den Wert des Instanzattributes mv_value der Basisklasse auch aus.

Um mit lo_doc2->get_value( ) den Wert 2 zu bekommen muss er vorher in dieser Instanz mit lo_doc2->set_value( 2 ) erst gesetzt werden.

Re: Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von jocoder (Specialist / 338 / 3 / 101 ) »
@SAP_Coder:
Rufe alle Methoden mit einer einzigen Referenzvariable auf.

Code: Alles auswählen.

DATA: lo_doc TYPE REF TO lcl_doc.

CREATE OBJECT lo_doc.

lo_doc->set_value( 2 ).
lo_doc->if_interface~get_data( ).
WRITE 
Die Redefinitionen der Methoden get_value und set_value sind auch nur notwendig, wenn die Implementierung unterschiedlich zur Oberklasse lcl_base ist. In deinem Fall ist sie eigentlich überflüssig.

Re: Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von IHe (Specialist / 141 / 35 / 45 ) »
Ich versuche es mal anders zu erklären:

Du hast einen Konstruktionsplan von einem normalen Auto. Den kopierst Du und frisierst ihn mit Heckspoiler und Sportgetriebe zu einem Rennauto. Nun lässt Du Deine Konstrukteure ein normales Auto und ein Rennauto bauen. Anschließend packst Du in das Radio vom normalen Auto eine CD ein und wunderst Dich, dass Du die Songs nicht im Rennauto abspielen kannst. Das Rennauto ist doch nur eine erweitere Kopie vom normalen Auto!

Ja... aber nein. Der Konstruktionsplan ist eine erweiterte Kopie. Die Autos sind eigenständig und nicht miteinander verbunden.

Folgende Benutzer bedankten sich beim Autor IHe für den Beitrag:
SAP_Coder

Ingo Hoffmann

ECC|S/4HANA|BTP
dbh SAP Solutions

Re: Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von SAP_Coder (ForumUser / 23 / 5 / 2 ) »
Thomas R. hat geschrieben:
16.03.2020 08:22
Du setzt mit lo_base->set_value( 2 ) in der Instanz lo_base das Attribut mv_value auf 2.
Richtig. So gewollt und gewünscht. :)
Die Instanz lo_doc2 wird davon nicht berührt. Deshalb ist dort mv_value immer noch 0 und du liest mit lo_doc2->get_value( ) den Wert des Instanzattributes mv_value der Basisklasse auch aus.
Und genau hier liegt mein Verständnisproblem. Ich hätte nämlich auch gedacht, dass ich den Wert des Instanzattributes der Basisklasse auslese (genau das möchte ich ja auch), nur kriege ich beim Aufruf der Methode den für mich unpassenden, also nicht den Wert, der dort steht (2), sondern 0. Und das verstehe ich nicht.

Um mit lo_doc2->get_value( ) den Wert 2 zu bekommen muss er vorher in dieser Instanz mit lo_doc2->set_value( 2 ) erst gesetzt werden.
Das ist mir bewußt, aber das möchte ich ja nicht. lo_doc2->get_value( ) soll den Wert des Attributes aus der Basisklasse zurückliefern und das passiert nicht.

Re: Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
SAP_Coder hat geschrieben:
16.03.2020 09:19
Das ist mir bewußt, aber das möchte ich ja nicht. lo_doc2->get_value( ) soll den Wert des Attributes aus der Basisklasse zurückliefern und das passiert nicht.
Ich möchte auch manchmal Sachen, die nicht gehen.
Das, was du möchtest geht definitiv nicht und wäre auch unlogisch!
Welchen Wert würdest du denn bei folgendem Coding erwarten wollen?

Code: Alles auswählen.

START-OF-SELECTION.
DATA lo_base1 type REF TO lcl_base.
DATA lo_base2 type REF TO lcl_base.
DATA lo_doc type REF TO lcl_doc.

CREATE OBJECT lo_base1.
CREATE OBJECT lo_base2.
CREATE OBJECT lo_doc.

lo_base1->set_value( 2 ).
lo_base2->set_value( 86 ).

DATA(lv_value) = lo_doc->get_data( ).

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
SAP_Coder


Re: Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von SAP_Coder (ForumUser / 23 / 5 / 2 ) »
Unlogisch ist es für mich nicht, sonst würde ich das so nicht probiert haben. Anhand Deiner durchaus berechtigten Frage bin aber aber zu dem Schluss gekommen, dass "nicht geht" an sich stimmt, es sei denn, ich verwende statische Attribute, richtig?

Re: Unterklasse nutzt Methode der Basisklasse -> "falsche" Werte werden zurückgeliefert

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Statische Attribute sind in jeder Instanz der Klasse verfügbar und haben den gleichen Wert. Insofern würdest du das Erreichen, was du möchtest. Der Wert gehört in dem Fall aber nicht nur zur Basisklasse, sondern eben zu allen Klassen dieses Typs.
Du kannst also nicht zwei Basisklassen haben (wie in meinem Beispiel) und beiden Basisklassen unterschiedliche Werte zuordnen.


Vergleichbare Themen

4
Antw.
4273
Views
In Superklasse auf Methode der Unterklasse zugreifen?
von Gast » 20.10.2005 12:23 • Verfasst in ABAP Objects®
5
Antw.
2030
Views
Wer nutzt wie und warum Freundschafts-Beziehungen?
von ralf.wenzel » 28.10.2018 11:57 • Verfasst in ABAP Objects®
7
Antw.
3638
Views
Oberklasse vs. Unterklasse
von ralf.wenzel » 10.01.2015 17:46 • Verfasst in ABAP Objects®
2
Antw.
2081
Views
Redefinition von Methoden in einer Unterklasse
von Dolph » 23.11.2005 14:12 • Verfasst in ABAP Objects®
4
Antw.
2701
Views
Abhängige Werte-Liste (F4-Werte)
von Gast » 27.12.2005 10:34 • Verfasst in ABAP® Core

Ü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

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