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.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 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.lo_base und lo_doc2 sind zwei verschiedene Instanzen. Sie haben keine Speicherbereiche gemeinsam (außer Klassenattribute in lcl_base).
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 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.
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
Richtig. So gewollt und gewünscht. :)
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.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.
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.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.
Ich möchte auch manchmal Sachen, die nicht gehen.
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( ).