Vererbung abstrakte Klassen

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

Vererbung abstrakte Klassen

Beitrag von rob_abc (Specialist / 106 / 27 / 44 ) »
Hallo
Gegeben ist eine abstrakte Klasse von der anderen Klassen erben. Im Konstruktor erbenden Klasse lese ich die notwendigen Daten von der Datenbank. Die Verknüpfung zwischen Instanziierung und Lesen der DB ist hier explizit gewollt.

Code: Alles auswählen.

CLASS lcl_component_abstract DEFINITION ABSTRACT.
  PUBLIC SECTION.
    METHODS constructor IMPORTING i_werks TYPE werks_d.
  PROTECTED SECTION.
    DATA m_werks TYPE werks_d.
ENDCLASS.
CLASS lcl_component_abstract IMPLEMENTATION.
  METHOD constructor.
    ASSERT i_werks IS NOT INITIAL.
    m_werks = i_werks.
  ENDMETHOD.
ENDCLASS.

class lcl_component1 DEFINITION INHERITING FROM lcl_component_abstract.
  public section.
    METHODS constructor IMPORTING i_werks TYPE werks_d.
endclass.
class lcl_component1 IMPLEMENTATION.
  METHOD constructor.
    super->constructor( i_werks = i_werks ).
    SELECT * from t001w where werks EQ @m_werks into table @DATA(db).
  ENDMETHOD.
ENDCLASS.

class lcl_component2 DEFINITION INHERITING FROM lcl_component_abstract.
  public section.
    METHODS constructor IMPORTING i_werks TYPE werks_d.
endclass.
class lcl_component2 IMPLEMENTATION.
  METHOD constructor.
    super->constructor( i_werks = i_werks ).
    SELECT * from t001l where werks EQ @m_werks into table @DATA(db).
  ENDMETHOD.
ENDCLASS.
Ich hätte eigentlich gerne im Konstruktor der abstrakten Klasse eine abstrakte Methode read_db( ), die ich dann in den erbenden Klassen redefinieren kann. Aber leider musste ich feststellen, dass ABAP das nicht zulässt. Abstrakte Methoden sind im Konstruktor nicht erlaubt.

Das redefinieren von im Konstruktor verwendeten Methoden führt nicht zum Ziel. Im folgenden Code wird bei Instanziierung nur das read_db( ) der abstrakten Klasse durchlaufen.

Code: Alles auswählen.

REPORT.
CLASS lcl_component_abstract DEFINITION ABSTRACT.
  PUBLIC SECTION.
    METHODS constructor IMPORTING i_werks TYPE werks_d.
  PROTECTED SECTION.
    DATA m_werks TYPE werks_d.
    METHODS read_db.
ENDCLASS.
CLASS lcl_component_abstract IMPLEMENTATION.
  METHOD constructor.
    ASSERT i_werks IS NOT INITIAL.
    m_werks = i_werks.
    read_db( ).
  ENDMETHOD.
  METHOD read_db.
  ENDMETHOD.
ENDCLASS.

class lcl_component1 DEFINITION INHERITING FROM lcl_component_abstract.
  PROTECTED SECTION.
    METHODS read_db REDEFINITION.
endclass.
class lcl_component1 IMPLEMENTATION.
  METHOD read_db.
    SELECT * from t001w where werks EQ @m_werks into table @DATA(db).
  ENDMETHOD.
ENDCLASS.

class lcl_component2 DEFINITION INHERITING FROM lcl_component_abstract.
  PROTECTED SECTION.
    METHODS read_db REDEFINITION.
endclass.
class lcl_component2 IMPLEMENTATION.
  METHOD read_db.
    SELECT * from t001l where werks EQ @m_werks into table @DATA(db).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  new lcl_component1( '1111' ).
Eine Alternative wäre read_db( ) abstrakt zu machen und sie nicht im Konstruktor, sondern in der Fabrik nach der Instanziierung aufzurufen. Finde ich aber auch nicht optimal, da das dann auch bei jeder Erstellung einer neuen Komponentenklasse bedacht werden muss.

Wie würdet ihr es machen?

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


Re: Vererbung abstrakte Klassen

Beitrag von DeathAndPain (Top Expert / 1939 / 257 / 412 ) »
Mir ist nicht klar, was der Konstruktor einer abstrakten Klasse sein soll. CONSTRUCTOR ist die Methode, die automatisch ausgeführt wird, wenn eine neue Objektinstanz erzeugt wird. Abstrakte Klassen haben gar keine Objektinstanzen (bzw. eine implizite Instanz, die immer existiert und somit nicht "erzeugt" wird). Was also soll das für ein "Konstruktor" sein?

Re: Vererbung abstrakte Klassen

Beitrag von rob_abc (Specialist / 106 / 27 / 44 ) »
In meinen obigen Beispiel ist es der Konstruktor den alle Kind-Implementierungen durchlaufen müssen. Also die gemeinsame Basis bei der Objekterstellung. Ob die Oberklasse dabei abstrakt ist oder nicht, spielt dabei keine Rolle.

Re: Vererbung abstrakte Klassen

Beitrag von black_adept (Top Expert / 4087 / 126 / 940 ) »
rob_abc hat geschrieben:
27.09.2024 16:41
Eine Alternative wäre read_db( ) abstrakt zu machen und sie nicht im Konstruktor, sondern in der Fabrik nach der Instanziierung aufzurufen. Finde ich aber auch nicht optimal, da das dann auch bei jeder Erstellung einer neuen Komponentenklasse bedacht werden muss.

Wie würdet ihr es machen?
Genau so solltest du es machen. Das Problem ist, dass deine Instanz offiziell erst nach durchlaufen des constructors existiert. Da du bei erbenden Klassen implizit oder explizit den super->constructor durchläufst kann ebendieser noch auf keine redefinierten Methoden zugreifen und durchläuft immer die Methoden mit dem Coding das bei ihm bekannt ist. Und das geht halt bei abstrakten Klassen nicht.
Aber genau dafür ist ja das Factory-Pattern optimal geeignet um ebendieses Problem sauber zu lösen. Und ehrlich gesagt verstehe ich auch nicht was daran nicht optimal ist. Wenn die Methode abstrakt definiert ist kannst du es in der erbenden Klasse ja nicht vergessen zu implementieren weil du es sonst nicht komplieren kannst.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 2):
rob_abcewx

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Vererbung abstrakte Klassen

Beitrag von rob_abc (Specialist / 106 / 27 / 44 ) »
Nicht optimal war die Kombination aus meiner Enttäuschung darüber, dass ich im Konstruktor nicht redefinieren kann und die schlechte Architektur meiner Fabrik. Nun habe ich die Fabrik etwas umgebaut und es funktioniert wunderbar.
Ich kann in 5 Jahren einer weitere Komponenten-Klasse erstellen, werde gezwungen die Methode zu implementieren und muss mich um ihren Aufruf nicht sorgen oder sonst irgendwelche Details kennen.

Re: Vererbung abstrakte Klassen

Beitrag von gtoXX (Specialist / 213 / 44 / 36 ) »
Eine bessere Architektur wäre gewesen, die Datenbeschaffung in einer Klasse erledigen und diese per Dependency Injektion zu injekten. Dann entsteht keine Vererbungsarie und die Objekte sind lose gekoppelt wie es sein sollte. Für eine andere Datenbeschaffung wird einfach eine andere Klasse injekted. Interface machts möglich.

Gleichzeitig wäre Single-Responsibility-Prinzip eingehalten. Ein Objekt beschafft, ein Objekt bearbeitet.
"Code lügt nicht ^^"

Re: Vererbung abstrakte Klassen

Beitrag von gtoXX (Specialist / 213 / 44 / 36 ) »
rob_abc hat geschrieben:
27.09.2024 20:13
Nicht optimal war die Kombination aus meiner Enttäuschung darüber, dass ich im Konstruktor nicht redefinieren kann und die schlechte Architektur meiner Fabrik. Nun habe ich die Fabrik etwas umgebaut und es funktioniert wunderbar.
Ich kann in 5 Jahren einer weitere Komponenten-Klasse erstellen, werde gezwungen die Methode zu implementieren und muss mich um ihren Aufruf nicht sorgen oder sonst irgendwelche Details kennen.
Frage : Wo soll das eine Factory sein ? Das ist kein Factory Pattern.
"Code lügt nicht ^^"

Re: Vererbung abstrakte Klassen

Beitrag von rob_abc (Specialist / 106 / 27 / 44 ) »
gtoXX hat geschrieben:
09.10.2024 12:58
Eine bessere Architektur wäre gewesen, die Datenbeschaffung in einer Klasse erledigen und diese per Dependency Injektion zu injekten. Dann entsteht keine Vererbungsarie und die Objekte sind lose gekoppelt wie es sein sollte. Für eine andere Datenbeschaffung wird einfach eine andere Klasse injekted. Interface machts möglich.

Gleichzeitig wäre Single-Responsibility-Prinzip eingehalten. Ein Objekt beschafft, ein Objekt bearbeitet.
Ich habe die Datenbeschaffung absichtlich nicht in einer zusätzlichen Klasse untergebracht, da die Klasse aus meinem Beispiel keine Daten verändert. Es wird lediglich eine Abstraktionsschicht über die DB gelegt und mit den Klassen darauf zugegriffen. Zusätzlich werden noch Prüfungen angeboten. SRP wird somit eingehalten.

Die Fabrik habe ich hier nicht gepostet. Sorry für die Verwirrung.

Seite 1 von 1

Vergleichbare Themen

5
Antw.
6724
Views
Abstrakte Methode im Class Builder anlegen
von jay-tee » 18.12.2006 14:22 • Verfasst in ABAP Objects®
4
Antw.
3661
Views
Java Definition Interface/Abstrakte Klasse
von erp-bt » 19.03.2019 14:01 • Verfasst in Java & SAP®
8
Antw.
9054
Views
Architektur von Abap-Klassen (Klassen Attribute)
von snooze » 12.04.2005 12:56 • Verfasst in ABAP Objects®
20
Antw.
2660
Views
Globale Klassen oder Lokale Klassen
von ZF_SAPler » 29.11.2022 13:47 • Verfasst in ABAP® für Anfänger
9
Antw.
5435
Views
Lokale Klassen in globalen Klassen
von ralf.wenzel » 20.04.2020 22:55 • Verfasst in ABAP Objects®

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.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
Gestern von Bright4.5 1 / 515
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2149
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8744