Update
This commit is contained in:
558
src/zcl_demo_abap_objects.clas.locals_imp.abap
Normal file
558
src/zcl_demo_abap_objects.clas.locals_imp.abap
Normal file
@@ -0,0 +1,558 @@
|
||||
*&--------------------------------------------------------------------*
|
||||
*& Custom exception classes
|
||||
*&--------------------------------------------------------------------*
|
||||
|
||||
CLASS cx_afternoon DEFINITION INHERITING FROM cx_static_check.
|
||||
ENDCLASS.
|
||||
|
||||
CLASS cx_night DEFINITION INHERITING FROM cx_static_check.
|
||||
ENDCLASS.
|
||||
|
||||
*&--------------------------------------------------------------------*
|
||||
*& Class to demonstrate various method parameters
|
||||
*& All formal parameters are passed by reference except the
|
||||
*& returning parameter.
|
||||
*&--------------------------------------------------------------------*
|
||||
CLASS lcl_demo DEFINITION.
|
||||
PUBLIC SECTION.
|
||||
CLASS-METHODS:
|
||||
"No parameters
|
||||
hallo_static_ext,
|
||||
|
||||
"One importing parameter
|
||||
powers_of_two IMPORTING i_pow TYPE i,
|
||||
|
||||
"Two importing parameters
|
||||
"Specifying REFERENCE(p) is optional; a formal parameter
|
||||
"without VALUE(p) or REFERENCE(p) is REFERENCE(p) by default
|
||||
addition IMPORTING i_add1 TYPE i
|
||||
REFERENCE(i_add2) TYPE i,
|
||||
|
||||
"Two importing parameters, one of them is optional.
|
||||
addition_optional IMPORTING i_add_mand TYPE i
|
||||
i_add_opt TYPE i OPTIONAL,
|
||||
|
||||
"Importing and exporting parameters
|
||||
subtraction IMPORTING i_sub1 TYPE i
|
||||
i_sub2 TYPE i
|
||||
EXPORTING e_sub_result TYPE i,
|
||||
|
||||
"One exporting parameter
|
||||
exporting_hallo EXPORTING text TYPE string,
|
||||
|
||||
"Changing parameter
|
||||
square_root CHANGING i_sqr TYPE decfloat34,
|
||||
|
||||
"Importing and returning parameters
|
||||
multiplication IMPORTING i_mult1 TYPE i
|
||||
i_mult2 TYPE i
|
||||
RETURNING VALUE(r_mult_result) TYPE i,
|
||||
|
||||
"Importing and exporting parameters
|
||||
"for comparing the signature with method 'multiplication'
|
||||
multiplication_exp_param IMPORTING i_multa TYPE i
|
||||
i_multb TYPE i
|
||||
EXPORTING e_mult_result TYPE i,
|
||||
|
||||
"Includes RAISING
|
||||
division IMPORTING i_div1 TYPE i
|
||||
i_div2 TYPE i
|
||||
RETURNING VALUE(r_div_result) TYPE decfloat34
|
||||
RAISING cx_sy_arithmetic_error,
|
||||
|
||||
check_daytime IMPORTING time TYPE t
|
||||
EXPORTING greetings TYPE string
|
||||
RAISING cx_afternoon cx_night,
|
||||
|
||||
"Include parameters with generic types
|
||||
generic_data IMPORTING i_data TYPE data,
|
||||
generic_tab IMPORTING i_anytab TYPE ANY TABLE.
|
||||
|
||||
CLASS-DATA: calc_result TYPE i,
|
||||
string TYPE string,
|
||||
some_data TYPE REF TO data.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_demo IMPLEMENTATION.
|
||||
|
||||
METHOD hallo_static_ext.
|
||||
string = |Hallo { sy-uname }. | &&
|
||||
|I'm a static method of class lcl_demo.|.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD square_root.
|
||||
i_sqr = sqrt( i_sqr ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD powers_of_two.
|
||||
calc_result = i_pow * i_pow.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD addition.
|
||||
calc_result = i_add1 + i_add2.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD addition_optional.
|
||||
calc_result = i_add_mand + i_add_opt.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD subtraction.
|
||||
e_sub_result = i_sub1 - i_sub2.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD exporting_hallo.
|
||||
text = |Hallo { sy-uname }. | && |I'm a static method of class lcl_demo with one exporting parameter.|.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD multiplication.
|
||||
r_mult_result = i_mult1 * i_mult2.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD multiplication_exp_param.
|
||||
e_mult_result = i_multa * i_multb.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD division.
|
||||
CLEAR string.
|
||||
|
||||
TRY.
|
||||
r_div_result = i_div1 / i_div2.
|
||||
CATCH cx_sy_arithmetic_error INTO DATA(exc).
|
||||
string = exc->get_text( ).
|
||||
ENDTRY.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD check_daytime.
|
||||
CLEAR string.
|
||||
|
||||
"Morning: 5 am to 12 pm
|
||||
IF time BETWEEN '050001' AND '120000'.
|
||||
DATA(subrc) = 0.
|
||||
ENDIF.
|
||||
|
||||
"Afternoon: 12 pm to 5 pm.
|
||||
IF time BETWEEN '120001' AND '170000'.
|
||||
subrc = 11.
|
||||
ENDIF.
|
||||
|
||||
"Evening 5 pm to 9 pm.
|
||||
"Commented out on purpose to have a time range for OTHERS :)
|
||||
"IF time BETWEEN '170001' AND '210000'.
|
||||
" subrc = 22.
|
||||
"ENDIF.
|
||||
|
||||
"Night: 9 pm to 4 am.
|
||||
IF time BETWEEN '210001' AND '050000'.
|
||||
subrc = 33.
|
||||
ENDIF.
|
||||
|
||||
IF subrc <> 0.
|
||||
CASE subrc.
|
||||
WHEN 11.
|
||||
greetings = |Good afternoon.|.
|
||||
WHEN 33.
|
||||
greetings = |Good night.|.
|
||||
WHEN OTHERS.
|
||||
greetings = |It's neither morning, afternoon or night. | &&
|
||||
|Hence, wishing you a good evening.|.
|
||||
ENDCASE.
|
||||
ELSE.
|
||||
greetings = |Good morning.|.
|
||||
ENDIF.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD generic_data.
|
||||
"A data reference variable is created that has the type of the
|
||||
"imported variable. Its content is store in the variable
|
||||
"some_data in the public section to be able to access the content.
|
||||
CREATE DATA some_data LIKE i_data.
|
||||
ASSIGN some_data->* TO FIELD-SYMBOL(<e>).
|
||||
<e> = i_data.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD generic_tab.
|
||||
"See implementation of generic_data.
|
||||
"Here, an internal table is handled.
|
||||
CREATE DATA some_data LIKE i_anytab.
|
||||
ASSIGN some_data->* TO FIELD-SYMBOL(<f>).
|
||||
<f> = i_anytab.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
*&--------------------------------------------------------------------*
|
||||
*& Class to demonstrate basics in the global class
|
||||
*&--------------------------------------------------------------------*
|
||||
|
||||
CLASS local_class DEFINITION.
|
||||
PUBLIC SECTION.
|
||||
|
||||
METHODS: constructor.
|
||||
|
||||
DATA: num_inst TYPE i,
|
||||
uuid TYPE sysuuid_x16,
|
||||
timestamp TYPE timestampl.
|
||||
|
||||
CLASS-DATA: no_of_instances TYPE i READ-ONLY,
|
||||
num_stat TYPE i VALUE 33.
|
||||
|
||||
CONSTANTS: const_number TYPE i VALUE 11.
|
||||
|
||||
TYPES type_i TYPE i.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
CLASS local_class IMPLEMENTATION.
|
||||
METHOD constructor.
|
||||
"Number of instances of the class are counted.
|
||||
no_of_instances = no_of_instances + 1.
|
||||
"Set a time stamp.
|
||||
GET TIME STAMP FIELD timestamp.
|
||||
"Increase the number.
|
||||
num_inst = num_inst + 1.
|
||||
"Get a random UUID.
|
||||
TRY.
|
||||
uuid = cl_system_uuid=>create_uuid_x16_static( ) .
|
||||
CATCH cx_uuid_error.
|
||||
ENDTRY.
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
|
||||
*&--------------------------------------------------------------------*
|
||||
*& Class to demonstrate events
|
||||
*&--------------------------------------------------------------------*
|
||||
|
||||
CLASS lcl_events DEFINITION.
|
||||
PUBLIC SECTION.
|
||||
DATA: greets TYPE string.
|
||||
|
||||
"Events declaration.
|
||||
EVENTS: morning, afternoon, evening, night.
|
||||
|
||||
"Event handler methods
|
||||
METHODS: morning_greets FOR EVENT morning OF lcl_events,
|
||||
afternoon_greets FOR EVENT afternoon OF lcl_events,
|
||||
evening_greets FOR EVENT evening OF lcl_events,
|
||||
night_greets FOR EVENT night OF lcl_events.
|
||||
|
||||
"Method to raise events
|
||||
METHODS: greetings.
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_events IMPLEMENTATION.
|
||||
|
||||
METHOD greetings.
|
||||
|
||||
DATA(syst_time) = cl_abap_context_info=>get_system_time( ).
|
||||
|
||||
"Morning: 5 am to 12 pm
|
||||
IF syst_time BETWEEN '050001' AND '120000'.
|
||||
RAISE EVENT morning.
|
||||
|
||||
"Afternoon: 12 pm to 5 pm.
|
||||
ELSEIF syst_time BETWEEN '120001' AND '170000'.
|
||||
RAISE EVENT afternoon.
|
||||
|
||||
"Evening 5 pm to 9 pm.
|
||||
ELSEIF syst_time BETWEEN '170001' AND '210000'.
|
||||
RAISE EVENT evening.
|
||||
|
||||
"Night: 9 pm to 5 am.
|
||||
ELSEIF syst_time BETWEEN '210001' AND '050000'.
|
||||
RAISE EVENT night.
|
||||
ENDIF.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD morning_greets.
|
||||
greets = |Good morning, { sy-uname }.|.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD afternoon_greets.
|
||||
greets = |Good afternoon, { sy-uname }.|.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD evening_greets.
|
||||
greets = |Good evening, { sy-uname }.|.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD night_greets.
|
||||
greets = |Good night, { sy-uname }.|.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
*&--------------------------------------------------------------------*
|
||||
*& Class to demonstrate constructors
|
||||
*&--------------------------------------------------------------------*
|
||||
|
||||
CLASS lcl_constructors DEFINITION.
|
||||
PUBLIC SECTION.
|
||||
|
||||
METHODS: constructor IMPORTING num1 TYPE i
|
||||
num2 TYPE i RAISING cx_sy_zerodivide.
|
||||
|
||||
DATA: uuid TYPE sysuuid_x16,
|
||||
in_div_result TYPE i,
|
||||
in_text TYPE string.
|
||||
|
||||
|
||||
CLASS-METHODS: class_constructor,
|
||||
add_1.
|
||||
|
||||
CLASS-DATA: no_of_instances TYPE i READ-ONLY,
|
||||
stat_number TYPE i,
|
||||
stat_text TYPE string.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_constructors IMPLEMENTATION.
|
||||
|
||||
METHOD constructor.
|
||||
"Get time stamp.
|
||||
DATA(ts1) = utclong_current( ).
|
||||
"Provide message.
|
||||
in_text = |The instance constructor of the class | &&
|
||||
|lcl_constructors was called on { ts1 }.|.
|
||||
|
||||
"Count number of instances.
|
||||
no_of_instances = no_of_instances + 1.
|
||||
"Get random UUID.
|
||||
TRY.
|
||||
uuid = cl_system_uuid=>create_uuid_x16_static( ) .
|
||||
CATCH cx_uuid_error.
|
||||
ENDTRY.
|
||||
|
||||
CLEAR in_div_result.
|
||||
"Do calculation.
|
||||
in_div_result = num1 / num2.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD class_constructor.
|
||||
"Set a number.
|
||||
stat_number = 999.
|
||||
"Get time stamp.
|
||||
DATA(ts2) = utclong_current( ).
|
||||
"Provide message.
|
||||
stat_text = |The static constructor of the class | &&
|
||||
|lcl_constructors was called on { ts2 } and the | &&
|
||||
|value for the variable 'stat_number' was set to | &&
|
||||
|{ stat_number }.|.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD add_1.
|
||||
stat_number += 1.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
*&--------------------------------------------------------------------*
|
||||
*& Classes to demonstrate inheritance, polymorphism and casting
|
||||
*&--------------------------------------------------------------------*
|
||||
|
||||
"Class 1
|
||||
CLASS lcl_class1 DEFINITION.
|
||||
|
||||
PUBLIC SECTION.
|
||||
"Note: All methods are purposely included in the public section.
|
||||
"Otherwise, it cannot be called in the demo's main class.
|
||||
METHODS: constructor IMPORTING i_obj TYPE string OPTIONAL,
|
||||
get_string RETURNING VALUE(str) TYPE string,
|
||||
get_obj_name RETURNING VALUE(obj) TYPE string.
|
||||
|
||||
PRIVATE SECTION.
|
||||
DATA: obj_name TYPE string.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_class1 IMPLEMENTATION.
|
||||
|
||||
METHOD constructor.
|
||||
obj_name = i_obj.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD get_obj_name.
|
||||
obj = obj_name.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD get_string.
|
||||
str = `Hallo`.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
"Class 2a
|
||||
CLASS lcl_class2a DEFINITION INHERITING FROM lcl_class1.
|
||||
|
||||
PUBLIC SECTION.
|
||||
|
||||
METHODS: get_string REDEFINITION,
|
||||
get_number_2a RETURNING VALUE(num) TYPE i..
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_class2a IMPLEMENTATION.
|
||||
|
||||
METHOD get_string.
|
||||
str = |{ super->get_string( ) }, { sy-uname }!|.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD get_number_2a.
|
||||
num = cl_abap_random_int=>create(
|
||||
seed = cl_abap_random=>seed( ) min = 1 max = 100 )->get_next( ).
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
"Class 2b
|
||||
CLASS lcl_class2b DEFINITION INHERITING FROM lcl_class1 FINAL.
|
||||
|
||||
PUBLIC SECTION.
|
||||
|
||||
METHODS: get_string REDEFINITION,
|
||||
get_number_2b RETURNING VALUE(num) TYPE i.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_class2b IMPLEMENTATION.
|
||||
|
||||
METHOD get_string.
|
||||
str = |{ super->get_string( ) } from lcl_class2b, { sy-uname }!|.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD get_number_2b.
|
||||
num = cl_abap_random_int=>create(
|
||||
seed = cl_abap_random=>seed( ) min = 1 max = 100 )->get_next( ).
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
"Class 3a
|
||||
CLASS lcl_class3a DEFINITION INHERITING FROM lcl_class2a FINAL.
|
||||
|
||||
PUBLIC SECTION.
|
||||
|
||||
METHODS: get_string REDEFINITION.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_class3a IMPLEMENTATION.
|
||||
|
||||
METHOD get_string.
|
||||
str = |{ super->get_string( ) } How are you doing?|.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
*&--------------------------------------------------------------------*
|
||||
*& Classes to demonstrate a factory method in a singleton
|
||||
*& and an abstract class.
|
||||
*&--------------------------------------------------------------------*
|
||||
|
||||
"Using the addition CREATE PRIVATE, objects can only be created by the class itself.
|
||||
CLASS lcl_singleton DEFINITION CREATE PRIVATE.
|
||||
PUBLIC SECTION.
|
||||
|
||||
METHODS: constructor,
|
||||
"Methods for setting and getting a time stamp.
|
||||
get_timestamp RETURNING VALUE(res_timestamp)
|
||||
TYPE timestampl,
|
||||
set_timestamp.
|
||||
|
||||
CLASS-METHODS:
|
||||
"Factory method that returns an instance of the class.
|
||||
get_instance RETURNING VALUE(res_instance) TYPE REF TO lcl_singleton.
|
||||
|
||||
CLASS-DATA: "Holds the number of overall instances.
|
||||
no_of_instances TYPE i READ-ONLY.
|
||||
|
||||
PRIVATE SECTION.
|
||||
CLASS-DATA: obj TYPE REF TO lcl_singleton.
|
||||
|
||||
DATA: timestamp TYPE timestampl.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_singleton IMPLEMENTATION.
|
||||
|
||||
METHOD get_instance.
|
||||
"Checking if an instance of the class already exists.
|
||||
"An instance should only be created if no instance exists
|
||||
"to make sure that there is only a single instance overall.
|
||||
IF obj IS NOT BOUND.
|
||||
obj = NEW #( ).
|
||||
ENDIF.
|
||||
"In case an instance already exists, the existing one is
|
||||
"always returned.
|
||||
res_instance = obj.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD constructor.
|
||||
"Counts the number of instances of the class.
|
||||
no_of_instances = no_of_instances + 1.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD get_timestamp.
|
||||
res_timestamp = timestamp.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD set_timestamp.
|
||||
GET TIME STAMP FIELD timestamp.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_sub DEFINITION DEFERRED.
|
||||
|
||||
CLASS lcl_abstract DEFINITION ABSTRACT.
|
||||
|
||||
PUBLIC SECTION.
|
||||
|
||||
CLASS-METHODS: factory_method IMPORTING check_num TYPE i
|
||||
RETURNING VALUE(obj) TYPE REF TO lcl_abstract.
|
||||
|
||||
CLASS-DATA: message TYPE string.
|
||||
|
||||
"Abstract method: There's no implementation in this class.
|
||||
METHODS: return_string ABSTRACT
|
||||
IMPORTING i_str TYPE string
|
||||
RETURNING VALUE(res_string) TYPE string.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_sub DEFINITION INHERITING FROM lcl_abstract.
|
||||
|
||||
PUBLIC SECTION.
|
||||
|
||||
METHODS: return_string REDEFINITION.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS lcl_abstract IMPLEMENTATION.
|
||||
|
||||
METHOD factory_method.
|
||||
"Purpose of factory method: An instance can only be created
|
||||
"if a certain condition is met.
|
||||
CASE check_num.
|
||||
WHEN 1.
|
||||
obj = NEW lcl_sub( ).
|
||||
message = `Great! I was able to create an instance.`.
|
||||
WHEN OTHERS.
|
||||
message = `What a pity. I'm not allowed to create an instance.`.
|
||||
ENDCASE.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_sub IMPLEMENTATION.
|
||||
|
||||
METHOD return_string.
|
||||
res_string = |I'm a returned string. | &&
|
||||
|The object reference variable is { i_str }.|.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
Reference in New Issue
Block a user