abap 类对象的泛型

*&---------------------------------------------------------------------*
*& 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.

************************************************************************************************************************

泛型与类相似,也是一种抽象数据类型,单泛型不是面向对象的概念,而是一种新的/不同于面向对象的编程范式。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值