*&---------------------------------------------------------------------*
*& Report ZREP_CLS_C07
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZREP_CLS_C07.
"定义局部类,包含两个方法和两个属性
class zlcl_cl01 definition.
public section.
data: mv_string type string value 'String of class attribute'.
data: mv_date type string value '2017.10.21'.
methods: print_string.
methods: print_date.
endclass.
"定义局部类的方法
class zlcl_cl01 implementation.
method: print_string.
write:/ 'print_string:',mv_string.
endmethod.
method: print_date.
write:/ 'print_date:',mv_date.
endmethod.
endclass.
start-of-selection.
"定义go_oref_1 为本地类对象。
DATA:go_oref_1 type ref to zlcl_cL01.
"定义gooref go_obj 为abap根类对象,创建对象时必须指定类名。
data:go_oref type ref to object.
data:go_obj type ref to object.
"定义sap标准类cl_abap_classdescr对象。
data:go_class_desc type ref to cl_abap_classdescr.
"1.以下为类的字段符号应用
"定义任意类型的字段符号,后面不指定类型,相当于 type any.
field-symbols <obj>.
"根据类名创建实例对象。
CREATE OBJECT go_oref_1 type zlcl_cl01.
"设定对象属性
go_oref_1->mv_string = 'String of Object go_oref_1'.
"将对象go_oref_1赋予字段类型。
assign go_oref_1 to <obj>.
"将字段类型再赋予历史对象 go_obj
go_obj = <obj>.
"对象 go_obj是字段类型在程序运行时指定的类型。
"所以编译器在编译阶段是无法知道其具体类型的
"以下注释掉的属性赋值语句是不可编译的
"go_obj->mv_string = 'String of Object go_oref '.
"而对象 go_obj 动态访问方法是可行的
CALL METHOD go_obj->('PRINT_STRING').
"根据参数类名动态创建实例对象
CREATE OBJECT go_oref type ('ZLCL_CL01').
"将对象go_oref 赋予字段类型。
assign go_oref to <obj>.
"将字段类型在赋予历史对象 go_obj
go_obj = <obj>.
"对象 go_obj动态访问方法是可行的。
CALL METHOD go_obj->('PRINT_DATE').
skip 2.
"2.以下为类的反射实现
"调用saap标准类cl_abap_classdescr方法获取类的属性和方法。
go_class_desc ?= cl_abap_classdescr=>describe_by_object_ref( go_oref ).
data:
"定义类中的属性內表和结构
gt_attr_desc type abap_attrdescr_tab,
gs_attr_desc type abap_attrdescr,
"定义类中的方法和內表和结构
gt_meth_desc type abap_methdescr_tab,
gs_meth_desc type abap_methdescr.
"定义字段符号,类型为任意类型,用于存储类的方法名称。
field-symbols <fs_meth> type any.
"获取类的方法列表到內表中
gt_meth_desc[] = go_class_desc->methods.
"动态打印类中的方法名称
loop at gt_meth_desc into gs_meth_desc.
"将类的方法名称赋予字段符号
assign gs_meth_desc-name to <fs_meth>.
write: / <fs_meth>.
endloop.
"定义字段符号,类型为任意类型,用于存储类的属性名称和属性值
field-symbols <fs_attr> type any.
"获取类的属性名称到內表中。
gt_attr_desc[] = go_class_desc->attributes.
"动态访问类中的属性
loop at gt_attr_desc into gs_attr_desc.
assign gs_attr_desc-name to <fs_attr>.
write:/ <fs_attr>.
assign go_oref->(gs_attr_desc-name) to <fs_attr>.
write:/ <fs_attr>.
endloop.
skip 2.
"动态访问类中的方法
loop at gt_meth_desc into gs_meth_desc.
"动态调用类中的方法。
CALL METHOD go_oref->(gs_meth_desc-name).
endloop.
************************************************************************************************************************
泛型与类相似,也是一种抽象数据类型,单泛型不是面向对象的概念,而是一种新的/不同于面向对象的编程范式。