实现方式-:传统的实现
"定义一个Table Line类型为通用的对象引用(TYPE REF TO OBJECT)的内表lt_shape,用于存放圆形和长方形的实例对象引用。
TYPES:BEGIN OF TY_SHAPE,
SHAPE TYPE REF TO OBJECT,
END OF TY_SHAPE.
TYPES:TT_SHPAE TYPE STANDARD TABLE OF TY_SHAPE.
DATA:LT_SHAPE TYPE TT_SHPAE,
LV_RESULT TYPE FLOAT.
"每次创建圆形或者长方形的对象实例之后,添加到内表中,然后LOOP内表,逐行取出元素,
"用IS INSTANCE OF关键字,判断当前记录指向的是圆形还是长方形实例,再用CAST进行强制类型转换,调用对应的面积计算方法。
DATA(LO_CIRCLE) = NEW ZCL_CIRCLE( 1 ).
DATA(ENTRY) = VALUE TY_SHAPE( SHAPE = LO_CIRCLE ).
APPEND ENTRY TO LT_SHAPE.
DATA(LO_RECTANGLE) = NEW ZCL_RECTANGLE( IV_HEIGHT = 1 IV_WIDTH = 2 ).
ENTRY = VALUE TY_SHAPE( SHAPE = LO_RECTANGLE ).
APPEND ENTRY TO LT_SHAPE.
LOOP AT LT_SHAPE ASSIGNING FIELD-SYMBOL(<FS_SHAPE>).
IF <FS_SHAPE>-SHAPE IS INSTANCE OF ZCL_CIRCLE.
LV_RESULT = LV_RESULT + CAST ZCL_CIRCLE( <FS_SHAPE>-SHAPE )->GET_AREA( ).
ELSEIF <FS_SHAPE>-SHAPE IS INSTANCE OF ZCL_RECTANGLE.
LV_RESULT = LV_RESULT + CAST ZCL_RECTANGLE( <FS_SHAPE>-SHAPE )->GET_AREA( ).
ENDIF.
WRITE:/ LV_RESULT.
ENDLOOP.
实现方式二:
借助CL_OBJECT_COLLECTION, 采取面向对象编程里多态(Polymorphism)的思路,我们不仅避免了丑陋的IF-ELSE,繁琐的类型探测IS INSTANCE OF和强制类型转换CAST,
同时将代码行数从37行减少到了20行。将来要是得增加对其他图形的支持,只需要新建图形类并实现,而无需修改下面的计算逻辑。
DATA:LV_RESULT TYPE FLOAT.
DATA(LO_CONTAINER) = NEW CL_OBJECT_COLLECTION( ).
DATA(LO_CIRCLE1) = NEW ZCL_CIRCLE( 1 ).
LO_CONTAINER->ADD( LO_CIRCLE1 ).
DATA(LO_CIRCLE2) = NEW ZCL_CIRCLE( 1 ).
LO_CONTAINER->ADD( LO_CIRCLE2 ).
DATA(LO_RECTANGLE1) = NEW ZCL_RECTANGLE( IV_HEIGHT = 1 IV_WIDTH = 2 ).
LO_CONTAINER->ADD( LO_RECTANGLE1 ).
DATA(LO_ITERATOR) = LO_CONTAINER->GET_ITERATOR( ).
WHILE LO_ITERATOR->HAS_NEXT( ).
DATA(LO_SHAPE) = CAST ZIF_SHAPE( LO_ITERATOR->GET_NEXT( ) ).
LV_RESULT = LV_RESULT + LO_SHAPE->GET_AREA( ).
ENDWHILE.
WRITE:/ LV_RESULT.