forked from moreus/ABAPDesignPattern
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathzdp_composite.abap
143 lines (122 loc) · 3.75 KB
/
zdp_composite.abap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
*&---------------------------------------------------------------------*
*& Report ZDP_COMPOSITE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zdp_composite.
CLASS lcl_shape DEFINITION ABSTRACT.
PUBLIC SECTION.
METHODS: constructor IMPORTING iv_name TYPE string,
add ABSTRACT IMPORTING io_shape TYPE REF TO lcl_shape,
remove ABSTRACT IMPORTING io_shape TYPE REF TO lcl_shape,
display ABSTRACT IMPORTING indent TYPE i.
PROTECTED SECTION.
DATA: v_name TYPE string.
ENDCLASS.
CLASS lcl_shape IMPLEMENTATION.
METHOD constructor.
me->v_name = iv_name.
ENDMETHOD.
ENDCLASS.
CLASS lcl_line DEFINITION INHERITING FROM lcl_shape.
PUBLIC SECTION.
METHODS: constructor IMPORTING iv_name TYPE string.
METHODS: add REDEFINITION,
remove REDEFINITION,
display REDEFINITION.
ENDCLASS.
CLASS lcl_line IMPLEMENTATION.
METHOD constructor.
super->constructor( iv_name ).
ENDMETHOD.
METHOD add.
WRITE: / 'Can not add'.
ENDMETHOD.
METHOD remove.
WRITE: / 'Can not delete'.
ENDMETHOD.
METHOD display.
WRITE: / ''.
DO indent TIMES.
WRITE: '-'.
ENDDO.
WRITE: v_name.
ENDMETHOD.
ENDCLASS.
CLASS lcl_picture DEFINITION INHERITING FROM lcl_shape.
PUBLIC SECTION.
METHODS: constructor IMPORTING iv_name TYPE string.
METHODS: add REDEFINITION,
remove REDEFINITION,
display REDEFINITION.
PRIVATE SECTION.
TYPES: BEGIN OF lty_shapes,
o_shape TYPE REF TO lcl_shape,
END OF lty_shapes.
DATA: li_shapes TYPE STANDARD TABLE OF REF TO lcl_shape.
ENDCLASS.
CLASS lcl_picture IMPLEMENTATION.
METHOD constructor.
super->constructor( iv_name ).
ENDMETHOD.
METHOD add.
APPEND io_shape TO li_shapes.
ENDMETHOD.
METHOD remove.
DELETE li_shapes WHERE table_line EQ io_shape.
ENDMETHOD.
METHOD display.
DATA: lo_shape TYPE REF TO lcl_shape.
WRITE: / ''.
DO indent TIMES.
WRITE: (2) '-'.
ENDDO.
WRITE: v_name.
DATA: lv_indent TYPE i.
lv_indent = indent + 1.
LOOP AT li_shapes INTO lo_shape.
lo_shape->display( lv_indent ).
ENDLOOP.
ENDMETHOD.
ENDCLASS.
CLASS lcl_main DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: run.
ENDCLASS.
*
CLASS lcl_main IMPLEMENTATION.
METHOD run.
DATA: lo_pic TYPE REF TO lcl_shape.
DATA: lo_shape TYPE REF TO lcl_shape.
CREATE OBJECT lo_pic TYPE lcl_picture EXPORTING iv_name = 'Picture'.
CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Left Line'.
lo_pic->add( lo_shape ).
CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Top Line'.
lo_pic->add( lo_shape ).
CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Right Line'.
lo_pic->add( lo_shape ).
CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Bottom Line'.
lo_pic->add( lo_shape ).
DATA: lo_pic2 TYPE REF TO lcl_shape.
CREATE OBJECT lo_pic2 TYPE lcl_picture EXPORTING iv_name = 'Picture 2'.
CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Left Line'.
lo_pic2->add( lo_shape ).
CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Top Line'.
lo_pic2->add( lo_shape ).
CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Right Line'.
lo_pic2->add( lo_shape ).
CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Bottom Line'.
lo_pic2->add( lo_shape ).
lo_pic->add( lo_pic2 ).
CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'text'.
lo_pic->add( lo_shape ).
* Uniform way to access the composition - it could be a primitive object
* or composition itself.
lo_pic->display( 4 ).
ENDMETHOD.
ENDCLASS.
*
START-OF-SELECTION.
lcl_main=>run( ).