forked from moreus/ABAPDesignPattern
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathzdp_state2.abap
172 lines (147 loc) · 4.35 KB
/
zdp_state2.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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
*&---------------------------------------------------------------------*
*& Report ZDP_STATE2
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zdp_state2.
CLASS account DEFINITION DEFERRED.
CLASS silverstate DEFINITION DEFERRED.
CLASS state DEFINITION ABSTRACT.
PUBLIC SECTION.
METHODS:
deposit ABSTRACT IMPORTING iv_amount TYPE d
, withdraw ABSTRACT EXPORTING ev_amount TYPE d
, payinterest ABSTRACT
, get_account ABSTRACT RETURNING VALUE(ro_account) TYPE REF TO account
, get_balance ABSTRACT RETURNING VALUE(rv_account) TYPE d
, get_interest ABSTRACT RETURNING VALUE(rv_interest) TYPE d
, get_lowerlimit ABSTRACT RETURNING VALUE(rv_lowerlimit) TYPE d
, get_upperlimit ABSTRACT RETURNING VALUE(rv_upperlimit) TYPE d.
PROTECTED SECTION.
DATA: mo_account TYPE REF TO account
, mv_balance TYPE d
, mv_interest TYPE d
, mv_lowerlimit TYPE d
, mv_upperlimit TYPE d.
ENDCLASS.
CLASS account DEFINITION.
PUBLIC SECTION.
METHODS:
get_account RETURNING VALUE(rv_account) TYPE string
, set_account IMPORTING iv_account TYPE string
, get_state RETURNING VALUE(ro_state) TYPE REF TO state
, set_state IMPORTING io_state TYPE REF TO state.
PRIVATE SECTION.
DATA: mv_account TYPE string,
mo_state TYPE REF TO state.
ENDCLASS.
CLASS account IMPLEMENTATION.
METHOD get_state.
ro_state = me->mo_state.
ENDMETHOD.
METHOD set_state.
me->mo_state = io_state.
ENDMETHOD.
METHOD get_account.
rv_account = me->mv_account.
ENDMETHOD.
METHOD set_account.
me->mv_account = iv_account.
ENDMETHOD.
ENDCLASS.
CLASS balance DEFINITION.
PUBLIC SECTION.
METHODS:
get_balance RETURNING VALUE(rv_balance) TYPE d
, set_balance IMPORTING iv_balance TYPE d.
PRIVATE SECTION.
DATA: mv_balance TYPE d.
ENDCLASS.
CLASS balance IMPLEMENTATION.
METHOD get_balance.
rv_balance = me->mv_balance.
ENDMETHOD.
METHOD set_balance.
me->mv_balance = iv_balance.
ENDMETHOD.
ENDCLASS.
CLASS redstate DEFINITION INHERITING FROM state.
PUBLIC SECTION.
METHODS: constructor IMPORTING io_state TYPE REF TO state,
initialize,
deposit REDEFINITION,
withdraw REDEFINITION,
payinterest REDEFINITION,
get_account REDEFINITION,
get_balance REDEFINITION,
get_interest REDEFINITION,
get_lowerlimit REDEFINITION,
get_upperlimit REDEFINITION.
PRIVATE SECTION.
METHODS: statechangecheck.
DATA: mv_servicefee.
ENDCLASS.
CLASS redstate IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
me->mv_balance = io_state->mv_balance.
me->mo_account = NEW account( ).
me->initialize( ).
ENDMETHOD.
METHOD initialize.
me->mv_interest = 0.
me->mv_lowerlimit = -100.
me->mv_upperlimit = 0.
me->mv_servicefee = 15.
ENDMETHOD.
METHOD deposit.
me->mv_balance = me->mv_balance + iv_amount.
me->statechangecheck( ).
ENDMETHOD.
METHOD withdraw.
ev_amount = ev_amount - me->mv_servicefee.
WRITE: / 'No funds available for withdrawal!'.
ENDMETHOD.
METHOD payinterest.
ENDMETHOD.
METHOD statechangecheck.
IF mv_balance > mv_upperlimit.
DATA: m_silverstate TYPE REF TO silverstate.
CREATE OBJECT m_silverstate.
mv_account->set_state( io_state = m_silverstate).
ENDIF.
ENDMETHOD.
METHOD get_balance.
rv_balance = me->mv_balance.
ENDMETHOD.
METHOD get_interest.
rv_interest = me->mv_interest.
ENDMETHOD.
METHOD get_account.
ro_account = me->mo_account.
ENDMETHOD.
METHOD get_lowerlimit.
rv_lowerlimit = me->mv_lowerlimit.
ENDMETHOD.
METHOD get_upperlimit.
rv_upperlimit = me->mv_upperlimit.
ENDMETHOD.
ENDCLASS.
CLASS silverstate DEFINITION INHERITING FROM state.
PUBLIC SECTION.
METHODS:
constructor IMPORTING io_state TYPE REF TO state OPTIONAL
iv_balance TYPE d OPTIONAL
io_account TYPE REF TO account OPTIONAL.
ENDCLASS.
CLASS silverstate IMPLEMENTATION.
IF io_state IS INITIAL.
me->mv_balance = io_state->get_balance( ).
me->mo_account = io_state->get_account( ).
ELSE.
me->mv_balance = iv_balance.
me->mo_account = io_account.
ENDIF.
ENDCLASS.