Black out im Bereich Objekterzeugung bei Vererbung Thema ist als GELÖST markiert

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

Black out im Bereich Objekterzeugung bei Vererbung

Beitrag von Thomas R. (Expert / 686 / 33 / 27 ) » 18. Jul 2019 16:05

Hallo zusammen,
gerade fehlt mir das Verständnis.
Ich habe eine abstrakte Oberklasse mit einem Attribut für ein Singleton.
Davon leite ich zwei instanziierbare Klassen ab, die als zwei separate Singleton funktionieren sollen.
Rufe ich jetzt Get_Instanz der Klasse 1 auf bekomme ich ein Objekt der Klasse 1.
Rufe ich jetzt Get_Instanz der Klasse 2 auf wird der Class Constructor der Klasse 2 durchlaufen(Debugger) aber das Objekt der Klasse 1 (in Get_Instanz der Klasse 2) gefunden und kein Objekt der Klasse 2 erzeugt sondern das Objekt der Klasse 1 verwendet.

Wieso 😳 ?? - Ich habe doch zwei getrennte Klassen.

Wer erläutert mir dies kurz?

MfG
Thomas R.

Mein Beispielreport liefert
zcl_level_1_class_1 Objekt Klasse 1
zcl_level_1_class_2 Objekt Klasse 1

wobei ich
zcl_level_1_class_1 Objekt Klasse 1
zcl_level_1_class_2 Objekt Klasse 2
erwarten würde

Beispielreport:

Code: Alles auswählen.

REPORT zrt_unklar.
"
CLASS zcl_level_0_class_1 DEFINITION
  ABSTRACT
  CREATE PUBLIC .
  "
  PUBLIC SECTION.
    METHODS demo.
    CLASS-METHODS class_constructor .
  PROTECTED SECTION.
    CLASS-DATA sv_classname TYPE seoclname .
    CLASS-DATA sv_demo TYPE char20.
    CLASS-DATA so_singleton TYPE REF TO zcl_level_0_class_1.
  PRIVATE SECTION.
ENDCLASS.
"
CLASS zcl_level_0_class_1 IMPLEMENTATION.
  METHOD class_constructor.
    sv_classname = 'zcl_level_0_class_1'.
  ENDMETHOD.
  METHOD demo.
    WRITE: / sv_classname, sv_demo.
  ENDMETHOD.
ENDCLASS.
"
"
CLASS zcl_level_1_class_1 DEFINITION
  INHERITING FROM zcl_level_0_class_1
  FINAL
  CREATE PRIVATE .
  "
  PUBLIC SECTION.
    CLASS-METHODS class_constructor .
    CLASS-METHODS get_instance
      RETURNING
        VALUE(r_object) TYPE REF TO zcl_level_0_class_1.
  PROTECTED SECTION.
  PRIVATE SECTION.
    METHODS constructor .
ENDCLASS.
"
CLASS zcl_level_1_class_1 IMPLEMENTATION.
  METHOD class_constructor.
    sv_classname = 'zcl_level_1_class_1'.
  ENDMETHOD.
  METHOD constructor.
    super->constructor( ).
  ENDMETHOD.
  METHOD get_instance.
    CLEAR:
      r_object.
    "
    IF so_singleton IS NOT BOUND.
      so_singleton = NEW zcl_level_1_class_1( ).
      sv_demo = 'Objekt Klasse 1'.
*   ELSE.
      "NOP
    ENDIF.
    r_object = so_singleton.
  ENDMETHOD.
ENDCLASS.

CLASS zcl_level_1_class_2 DEFINITION
*  public
  INHERITING FROM zcl_level_0_class_1
  FINAL
  CREATE PRIVATE .
  "
  PUBLIC SECTION.
    CLASS-METHODS class_constructor .
    CLASS-METHODS get_instance
      RETURNING
        VALUE(r_object) TYPE REF TO zcl_level_0_class_1.
  PROTECTED SECTION.
  PRIVATE SECTION.
    METHODS constructor .
ENDCLASS.
"
CLASS zcl_level_1_class_2 IMPLEMENTATION.
  METHOD class_constructor.
    sv_classname = 'zcl_level_1_class_2'.
  ENDMETHOD.
  METHOD constructor.
    super->constructor( ).
  ENDMETHOD.
  METHOD get_instance.
    CLEAR:
      r_object.
    "
    IF so_singleton IS NOT BOUND.
      so_singleton = NEW zcl_level_1_class_2( ).
      sv_demo = 'Objekt Klasse 2'.
*   ELSE.
      "NOP
    ENDIF.
    r_object = so_singleton.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  zcl_level_1_class_1=>get_instance( )->demo( ).
  zcl_level_1_class_2=>get_instance( )->demo( ).


Re: Black out im Bereich Objekterzeugung bei Vererbung

Beitrag von M@atze! (ForumUser / 42 / 3 / 5 ) » 18. Jul 2019 16:46

Hi,

das Problem ist hier das statische Attribut so_singleton.

"Die Anweisung CLASS-DATA kann nur im Deklarationsteil einer Klasse oder eines Interfaces verwendet werden. Sie deklariert ein statisches Attribut attr, dessen Gültigkeit nicht an Instanzen einer Klasse, sondern an die Klasse selbst gebunden ist. Alle Instanzen der Klasse und ihrer Unterklassen greifen gemeinsam auf ein statisches Attribut zu."

Und da in "so_singleton" das Objekt von Klasse hinterlegt ist wird dieses zurückgeliefert:

METHOD get_instance.
CLEAR:
r_object.
"
IF so_singleton IS NOT BOUND.
so_singleton = NEW zcl_level_1_class_1( ).
sv_demo = 'Objekt Klasse 1'.
* ELSE.
"NOP
ENDIF.
r_object = so_singleton.
ENDMETHOD.

Folgende Benutzer bedankten sich beim Autor M@atze! für den Beitrag:
Thomas R. (19. Jul 2019 07:41)


Re: Black out im Bereich Objekterzeugung bei Vererbung

Beitrag von M@atze! (ForumUser / 42 / 3 / 5 ) » 18. Jul 2019 17:01

Ohne den Sinn und Zweck kennen ...

Wenn du das Attribut so_singleton in die abgeleiteten Klassen "zcl_level_1_class_1" und "zcl_level_1_class_2" verschiebst funktioniert es.

Code: Alles auswählen.


REPORT zrt_unklar.
"
CLASS zcl_level_0_class_1 DEFINITION
  ABSTRACT
  CREATE PUBLIC .
  "
  PUBLIC SECTION.
    CLASS-METHODS demo.
    CLASS-METHODS class_constructor .
  PROTECTED SECTION.
    CLASS-DATA sv_classname TYPE seoclname .
    CLASS-DATA sv_demo TYPE char20.
*    class-DATA so_singleton TYPE REF TO zcl_level_0_class_1.
  PRIVATE SECTION.
ENDCLASS.
"
CLASS zcl_level_0_class_1 IMPLEMENTATION.
  METHOD class_constructor.
    sv_classname = 'zcl_level_0_class_1'.
  ENDMETHOD.
  METHOD demo.
    WRITE: / sv_classname, sv_demo.
  ENDMETHOD.
ENDCLASS.
"
"
CLASS zcl_level_1_class_1 DEFINITION
  INHERITING FROM zcl_level_0_class_1
  FINAL
  CREATE PRIVATE .
  "
  PUBLIC SECTION.
    CLASS-METHODS class_constructor .
    CLASS-METHODS get_instance
      RETURNING
        VALUE(r_object) TYPE REF TO zcl_level_0_class_1.
  PROTECTED SECTION.
  PRIVATE SECTION.
    CLASS-DATA: so_singleton TYPE REF TO zcl_level_1_class_1.
    METHODS constructor .
ENDCLASS.
"
CLASS zcl_level_1_class_1 IMPLEMENTATION.
  METHOD class_constructor.
    sv_classname = 'zcl_level_1_class_1'.
  ENDMETHOD.
  METHOD constructor.
    super->constructor( ).
  ENDMETHOD.
  METHOD get_instance.
    CLEAR:
      r_object.
    "
    IF so_singleton IS NOT BOUND.
      so_singleton = NEW zcl_level_1_class_1( ).
      sv_demo = 'Objekt Klasse 1'.
*   ELSE.
      "NOP
    ENDIF.
    r_object = so_singleton.
  ENDMETHOD.
ENDCLASS.

CLASS zcl_level_1_class_2 DEFINITION
*  public
  INHERITING FROM zcl_level_0_class_1
  FINAL
  CREATE PRIVATE .
  "
  PUBLIC SECTION.
    CLASS-METHODS class_constructor .
    CLASS-METHODS get_instance
      RETURNING
        VALUE(r_object) TYPE REF TO zcl_level_0_class_1.
  PROTECTED SECTION.
  PRIVATE SECTION.
    CLASS-DATA: so_singleton TYPE REF TO zcl_level_1_class_2.
    METHODS constructor .
ENDCLASS.
"
CLASS zcl_level_1_class_2 IMPLEMENTATION.
  METHOD class_constructor.
    sv_classname = 'zcl_level_1_class_2'.
  ENDMETHOD.
  METHOD constructor.
    super->constructor( ).
  ENDMETHOD.
  METHOD get_instance.
    CLEAR:
      r_object.
    "
    IF so_singleton IS NOT BOUND.
      so_singleton = NEW zcl_level_1_class_2( ).
      sv_demo = 'Objekt Klasse 2'.
*   ELSE.
      "NOP
    ENDIF.
    r_object = so_singleton.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  zcl_level_1_class_1=>get_instance( )->demo( ).
  zcl_level_1_class_2=>get_instance( )->demo( ).


Re: Black out im Bereich Objekterzeugung bei Vererbung

Beitrag von Thomas R. (Expert / 686 / 33 / 27 ) » 19. Jul 2019 07:36

Danke M@atze!
Du hast Licht in mein Dunkel gebracht. 😊
Irgendwie hatte ich einen Eimer über meine Lampe gestülpt (aka: Eigentlich wusste ich das schon mal 😨 )

MfG
Thomas R.

Seite 1 von 1

Aktuelle Forenbeiträge

HTTP Request
vor 22 Stunden von a-dead-trousers 4 / 70
Verfügbarkeitsprüfung
Gestern von deejey 2 / 55
Verwaltung
Gestern von deejey 2 / 48
BSP-Seiten als Service - Problem bei HTTP-Request
vor 2 Tagen von Xilukarim 1 / 49

Unbeantwortete Forenbeiträge

BSP-Seiten als Service - Problem bei HTTP-Request
vor 2 Tagen von Xilukarim 1 / 49
CCS Bonusabrechnung
vor 2 Tagen von SAP_ENTWICKLER 1 / 31
At Selection-Screen
vor 3 Tagen von L0w-RiDer 1 / 49
SP01 Verweildauer
vor einer Woche von SAP_ENTWICKLER 1 / 102
Transaktion OMT3B Subscreens in Dynpros einhängen
vor einer Woche von SAP_ENTWICKLER 1 / 69