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.
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' ).
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.rob_abc hat geschrieben: ↑27.09.2024 16:41Eine 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?
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 2):
rob_abc • ewx
Frage : Wo soll das eine Factory sein ? Das ist kein Factory Pattern.rob_abc hat geschrieben: ↑27.09.2024 20:13Nicht 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.
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.gtoXX hat geschrieben: ↑09.10.2024 12:58Eine 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.