
INTERFACE: zlif_interface.
METHODS: do_something RETURNING VALUE(zrv_text) TYPE string.
ENDINTERFACE.
CLASS zlcl_super DEFINITION ABSTRACT CREATE PROTECTED.
PUBLIC SECTION.
INTERFACES zlif_interface.
ALIASES: do_something FOR zlif_interface~do_something.
ENDCLASS.
CLASS zlcl_subclass_one DEFINITION INHERITING FROM zlcl_super CREATE PROTECTED.
PUBLIC SECTION.
METHODS: do_something REDEFINITION.
ENDCLASS.
CLASS zlcl_subclass_two DEFINITION INHERITING FROM zlcl_super CREATE PROTECTED.
PUBLIC SECTION.
METHODS: do_something REDEFINITION.
ENDCLASS.
UML: Singleton with Inheritance
INTERFACE: zlif_interface.
METHODS: do_something RETURNING VALUE(zrv_text) TYPE string.
CLASS-DATA: zgr_instance TYPE REF TO zlif_interface.
CLASS-METHODS: get_instance RETURNING VALUE(zrv_instance) TYPE REF TO zlif_interface.
ENDINTERFACE.
CLASS zlcl_super DEFINITION ABSTRACT CREATE PROTECTED.
PUBLIC SECTION.
INTERFACES zlif_interface.
ENDCLASS.
CLASS zlcl_super IMPLEMENTATION.
METHOD do_something.
...
ENDMETHOD.
METHOD get_instance.
IF zgr_instance IS INITIAL.
zgr_instance = NEW #( ).
ENDIF.
zrv_instance = zgr_instance.
ENDMETHOD.
ENDCLASS.
INTERFACE: zlif_interface.
METHODS: do_something RETURNING VALUE(zrv_text) TYPE string.
CLASS-DATA: zgr_instance TYPE REF TO zlif_interface.
CLASS-METHODS:
get_instance CHANGING zcv_instance TYPE any.
ENDINTERFACE.
CLASS zlcl_super DEFINITION ABSTRACT CREATE PROTECTED.
PUBLIC SECTION.
INTERFACES zlif_interface.
ALIASES: zgr_instance FOR zlif_interface~zgr_instance,
do_something FOR zlif_interface~do_something,
get_instance FOR zlif_interface~get_instance.
ENDCLASS.
CLASS zlcl_super IMPLEMENTATION.
METHOD get_instance.
IF zgr_instance IS INITIAL
AND cl_abap_refdescr=>describe_by_data( zcv_instance )->kind = cl_abap_typedescr=>kind_ref.
DATA(lo_ref_descr) = CAST cl_abap_refdescr( cl_abap_refdescr=>describe_by_data( zcv_instance ) ).
DATA(zlv_classname) = lo_ref_descr->get_referenced_type( )->get_relative_name( ).
DATA: zlr_instance TYPE REF TO zlif_interface.
CREATE OBJECT zlr_instance TYPE (zlv_classname).
zgr_instance ?= zlr_instance.
ENDIF.
zcv_instance ?= zgr_instance.
ENDMETHOD.
ENDCLASS.
CREATE OBJECT DATA(zlr_instance) TYPE
( CAST cl_abap_refdescr( cl_abap_refdescr=>describe_by_data( zcv_instance )
)->get_referenced_type( )->get_relative_name( ) ).
CREATE OBJECT DATA(zlr_instance) TYPE "This yields an annoying syntax error
(lo_ref_descr->get_referenced_type( )->get_relative_name( ) ).
"This one creates an annoying syntax error as well:
CREATE OBJECT zlr_instance TYPE (lo_abap_refdescr->get_referenced_type( )->get_relative_name( ) ).
UML: Factory for a singleton with Inheritance
INTERFACE: zlif_interface.
TYPES: BEGIN OF zlty_instance,
classname TYPE seoclsname,
instance TYPE REF TO zlif_interface,
END OF zlty_instance,
zltty_instances TYPE SORTED TABLE OF zlty_instance
WITH UNIQUE KEY classname
WITH UNIQUE SORTED KEY k2 COMPONENTS instance.
CLASS-DATA zgt_instances TYPE zltty_instances.
CLASS-METHODS:
get_instance CHANGING zcv_instance TYPE any.
METHODS: do_something RETURNING VALUE(zrv_text) TYPE string.
ENDINTERFACE.
CLASS zlcl_super DEFINITION ABSTRACT CREATE PROTECTED.
PUBLIC SECTION.
INTERFACES zlif_interface.
ALIASES: do_something FOR zlif_interface~do_something,
get_instance FOR zlif_interface~get_instance.
PRIVATE SECTION.
ALIASES: zgt_instances FOR zlif_interface~zgt_instances.
ENDCLASS.
CLASS zlcl_super IMPLEMENTATION.
METHOD get_instance.
" https://answers.sap.com/questions/6203810/inherited-static-method-to-return-instance-of-sub-.html
"Get the class-type of the requested object to be created.
IF cl_abap_refdescr=>describe_by_data( zcv_instance )->kind = cl_abap_typedescr=>kind_ref.
DATA(lo_ref_descr) = CAST cl_abap_refdescr( cl_abap_refdescr=>describe_by_data( zcv_instance ) ).
DATA(zlv_classname) = lo_ref_descr->get_referenced_type( )->get_relative_name( ).
DATA: zls_instance TYPE zlif_interface~zlty_instance.
READ TABLE zgt_instances WITH KEY classname = zlv_classname INTO zls_instance .
IF sy-subrc NE 0.
DATA: zlr_instance TYPE REF TO zlif_interface.
CREATE OBJECT zlr_instance TYPE (zlv_classname).
zls_instance = VALUE zlif_interface~zlty_instance(
classname = zlv_classname
instance = zlr_instance ).
INSERT zls_instance INTO TABLE zgt_instances .
ENDIF.
zcv_instance ?= zls_instance-instance.
ENDIF.
ENDMETHOD.
ENDCLASS.
Factory
CLASS zlcl_factory DEFINITION ABSTRACT FINAL CREATE PRIVATE.
PUBLIC SECTION.
TYPES: BEGIN OF zlty_instances,
instance_type TYPE string,
classname TYPE seoclsname,
END OF zlty_instances,
zltty_instances TYPE SORTED TABLE OF zlty_instances
WITH UNIQUE KEY instance_type
WITH UNIQUE SORTED KEY k2 COMPONENTS classname.
CLASS-METHODS:
class_constructor,
get_possible_instance_classes RETURNING VALUE(zrt_instances) TYPE zltty_instances,
get_some_instance IMPORTING zip_singleton TYPE any
RETURNING VALUE(zrr_instance) TYPE REF TO zlif_interface ."RAISING zlcx_error .
PRIVATE SECTION.
CLASS-DATA:
zgt_instance_types TYPE zltty_instances,
zgr_instance TYPE REF TO zlcl_factory.
ENDCLASS.
CLASS zlcl_factory IMPLEMENTATION.
METHOD class_constructor.
zgt_instance_types = VALUE zltty_instances(
( instance_type = |one| classname = |ZLCL_SUBCLASS_ONE| )
( instance_type = |two| classname = |ZLCL_SUBCLASS_TWO| )
).
ENDMETHOD.
METHOD get_possible_instance_classes.
zrt_instances = zgt_instance_types.
ENDMETHOD.
METHOD get_some_instance.
DATA dref TYPE REF TO data.
CREATE DATA dref TYPE REF TO (zip_singleton).
ASSIGN dref->* TO FIELD-SYMBOL(<fs_ref>).
"Create & fill the signature of the method
DATA(ptab) = VALUE abap_parmbind_tab(
( name = 'ZCV_INSTANCE'
kind = cl_abap_objectdescr=>changing
value = REF #( <fs_ref> ) )
) .
CALL METHOD (zip_singleton)=>('GET_INSTANCE')
PARAMETER-TABLE ptab.
zrr_instance ?= <fs_ref>.
ENDMETHOD.
* Weird issue: If I define my interface first, and my exception class
* second, I get this error, even if I use a DEFINITION DEFERRED for my
* exception class.
* The class "ZLCX_ERROR" was not derived from
* either "CX_STATIC_CHECK" or "CX_DYNAMIC_CHECK".
*** DEFINITIONS ****************************************************
CLASS zlcx_error DEFINITION DEFERRED.
INTERFACE: zlif_interface.
TYPES: ....
CLASS-METHODS:
get_instance CHANGING zcv_instance TYPE any RAISING zlcx_error .
METHODS: do_something RETURNING VALUE(zrv_text) TYPE string.
ENDINTERFACE.
CLASS zlcx_error DEFINITION
INHERITING FROM cx_dynamic_check.
PUBLIC SECTION.
INTERFACES: if_t100_message.
...
ENDCLASS.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
2 | |
2 | |
2 | |
2 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 |