之前一直用c或者汇编写代码,对OO的理解仅限于看过c++ primer。在SK是在无聊,看了BC404和code complete。404里有一段对多态的例子,感觉是在是比面向过程好用。例子如下:
- * Procedural realization of the polymorphism example
- DATA: plane_list TYPE TABLE OF plane_list_type,
- plane TYPE plane_list_type, ...
- ...
- LOOP AT plane_list INTO plane.
- CASE plane-category.
- WHEN 'CARGO'.
- PERFORM estimate_fuel_consum_for_cargo USING ...
- CHANGING cargo_fuel.
- needed_fuel = needed_fuel + cargo_fuel.
- WHEN 'PASSENGER'.
- PERFORM estimate_fuel_consum_for_pass USING ...
- CHANGING passenger_fuel.
- needed_fuel = needed_fuel + passenger_fuel.
- ENDCASE.
- ENDLOOP.
csdn好像不能插入ABAP代码。可以看到对于计算同一飞机耗油的计算如果有不同方法那么就用if来判断,再加上类型判断。如果用了OO,看下面我写的加法例子:
-
INCLUDE zcalc.
DATA: ref_calc1 TYPE REF TO calc,
ref_calc2 TYPE REF TO calc2,
ref_table_calc TYPE TABLE OF REF TO calc,
ref_wa TYPE REF TO calc,
sum TYPE i.
START-OF-SELECTION.
CREATE OBJECT: ref_calc1.
APPEND ref_calc1 TO ref_table_calc.
CREATE OBJECT: ref_calc2.
APPEND ref_calc2 TO ref_table_calc.
LOOP AT ref_table_calc INTO ref_wa.
CALL METHOD ref_wa->add
EXPORTING
a1 = 23
a2 = 23.
CALL METHOD ref_wa->print.
ENDLOOP.Include里类的定义如下:
CLASS calc DEFINITION.
PUBLIC SECTION.
METHODS: add IMPORTING a1 TYPE i
a2 TYPE i,
print.
* PRIVATE SECTION.
DATA: sum TYPE i. "sum作为私有变量子类继承时调用print会出现问题
ENDCLASS. "calc DEFINITION
*----------------------------------------------------------------------*
* CLASS calc DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS calc IMPLEMENTATION.
METHOD add.
sum = a1 + a2.
ENDMETHOD. "calc
METHOD print.
WRITE:/ 'sum is' , sum LEFT-JUSTIFIED.
ENDMETHOD. "print
ENDCLASS. "calc DEFINITION
*----------------------------------------------------------------------*
* CLASS calc2 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS calc2 DEFINITION INHERITING FROM calc.
PUBLIC SECTION.
METHODS: add REDEFINITION.
PRIVATE SECTION.
DATA sum1 TYPE i.
ENDCLASS. "calc2 DEFINITION
*----------------------------------------------------------------------*
* CLASS calc2 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS calc2 IMPLEMENTATION.
METHOD add.
sum = a1 + 2 * a2.
ENDMETHOD. "add
ENDCLASS. "calc2 IMPLEMENTATION - 可以看到一个loop就解决了,如果添加修改只用多继承一个类。