Black out im Bereich Objekterzeugung bei Vererbung

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).
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 / 757 / 78 / 34 ) »
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( ).

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


Re: Black out im Bereich Objekterzeugung bei Vererbung

Beitrag von M@atze! (ForumUser / 92 / 6 / 21 ) »
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.


Re: Black out im Bereich Objekterzeugung bei Vererbung

Beitrag von M@atze! (ForumUser / 92 / 6 / 21 ) »
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 / 757 / 78 / 34 ) »
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

Vergleichbare Themen

0
Antw.
1383
Views
Vererbung von CL_RSR_WWW_MODIFY_TABLE
von ratoshuan » 04.04.2006 18:45 • Verfasst in Web-Dynpro, BSP + BHTML
7
Antw.
4493
Views
Interfaces vs. Vererbung
von ewx » 02.12.2014 18:32 • Verfasst in ABAP Objects®
2
Antw.
1856
Views
Exceptions und Vererbung
von SaskuAc » 08.11.2018 13:43 • Verfasst in ABAP® für Anfänger
12
Antw.
6623
Views
Textelemente und Vererbung, Ideen?
von GastX » 21.01.2015 09:17 • Verfasst in ABAP Objects®
7
Antw.
2248
Views
Vererbung abstrakte Klassen
von rob_abc » 27.09.2024 16:41 • 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

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.