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:
rob_abc