资讯动态

ABAP-OO:(7)类对象的动态创建和调用

发布时间:2026/9/14 10:52:52 来源:尧图企业网站定制
在 ABAP 面向对象开发中动态创建数据、动态创建对象、动态调用方法是实现灵活架构、低耦合、可配置化的关键技术。它区别于静态编码核心特点是类型与行为不在编译期固定而是在程序运行时动态决定。一、什么是动态创建静态创建平时写代码我们都是写死类型、写死类名、写死方法编译时就确定了。动态创建程序跑起来以后才决定创建什么、调用什么。二、动态创建类对象动态创建对象是指根据类名字符串在运行时实例化对应的类对象常配合自定义配置表使用实现工厂模式、策略模式等灵活架构。语法CREATE OBJECT 引用变量 TYPE (类名).动态创建三大注意点类名必须大写动态创建时字符串必须大写否则系统找不到类。确认类可直接实例化类需定义为CREATE PUBLIC不能是抽象类、单例限制类。必须使用 TRY…CATCH 捕获异常避免因类名错误、类不存在导致程序 DUMP。动态创建类对象示例代码CLASS zlcl_class DEFINITION. PUBLIC SECTION. DATA: mv_value TYPE string. METHODS: set_value IMPORTING iv_value TYPE string, display_value. ENDCLASS. CLASS zlcl_class IMPLEMENTATION. METHOD display_value. WRITE:/ Class Instance Attribute:, mv_value. ENDMETHOD. METHOD set_value. mv_value iv_value. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA: go_oref TYPE REF TO zlcl_class. DATA: exc_ref TYPE REF TO cx_root, exc_text TYPE string. TRY. CREATE OBJECT go_oref TYPE (ZLCL_CLASS). go_oref-set_value( Test String ). go_oref-display_value( ). CATCH cx_sy_create_object_error INTO exc_ref. exc_text exc_ref-get_text( ). MESSAGE exc_text TYPE I. ENDTRY.运行结果Class Instance Attribute: Test String三、动态调用方法语法方法名必须大写方法需为PUBLIC权限CALL METHOD 实例-(方法名字符串).动态调用方法示例代码CLASS zcl_product IMPLEMENTATION. METHOD print_desc. WRITE: / Print PRODUCT. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA: lo_product TYPE REF TO zcl_product. DATA: lv_type_name TYPE string VALUE ZCL_PRODUCT. DATA: lv_method_name TYPE string VALUE PRINT_DESC. DATA: exc_ref TYPE REF TO cx_root, exc_text TYPE string. TRY. CREATE OBJECT lo_product TYPE (lv_type_name). CALL METHOD lo_product-(lv_method_name). CATCH cx_sy_create_object_error INTO exc_ref. exc_text exc_ref-get_text( ). MESSAGE exc_text TYPE I. ENDTRY.运行结果Print PRODUCT四、使用场景与价值CREATE OBJECT的应用场景广泛下表总结了其主要使用场景基本对象实例化标准ABAP对象创建动态编程运行时确定类名、动态类型实例化设计模式实现工厂模式、单例模式的对象创建控制框架开发插件系统、动态UI组件创建、规则引擎等数据封装创建业务实体对象、数据传输对象DTO为什么要进行动态创建类对象平时写代码的案例IF 业务 WMS. lo_obj NEW zcl_wms( ). ELSEIF 业务 OA. lo_obj NEW zcl_oa( ). ELSEIF 业务 CRM. lo_obj NEW zcl_crm( ). ... ENDIF.问题试想一下当IF需要到达一百条时程序是怎么样硬编码、难维护加业务必须改代码、传输代码臃肿、不优雅使用工厂模式 动态创建 多态的用法不写死类名、不写死判断、完全由变量决定、扩展不用改程序的示例代码*----------------------------------------------------------------------* * 接口统一契约 *----------------------------------------------------------------------* INTERFACE zif_handler. METHODS execute IMPORTING iv_data TYPE string. ENDINTERFACE. *----------------------------------------------------------------------* * 实现类1企业微信 *----------------------------------------------------------------------* CLASS zcl_wechat DEFINITION CREATE PUBLIC. PUBLIC SECTION. INTERFACES zif_handler. ENDCLASS. CLASS zcl_wechat IMPLEMENTATION. METHOD zif_handler~execute. WRITE: / 企业微信处理, iv_data. ENDMETHOD. ENDCLASS. *----------------------------------------------------------------------* * 实现类2OA *----------------------------------------------------------------------* CLASS zcl_oa DEFINITION CREATE PUBLIC. PUBLIC SECTION. INTERFACES zif_handler. ENDCLASS. CLASS zcl_oa IMPLEMENTATION. METHOD zif_handler~execute. WRITE: / OA 处理, iv_data. ENDMETHOD. ENDCLASS. *----------------------------------------------------------------------* * 实现类3WMS *----------------------------------------------------------------------* CLASS zcl_wms DEFINITION CREATE PUBLIC. PUBLIC SECTION. INTERFACES zif_handler. ENDCLASS. CLASS zcl_wms IMPLEMENTATION. METHOD zif_handler~execute. WRITE: / WMS 处理, iv_data. ENDMETHOD. ENDCLASS. *----------------------------------------------------------------------* * 【重点来了】 * 主程序完全不知道要创建谁只认接口 * 类名来自外部输入运行时才确定 *----------------------------------------------------------------------* START-OF-SELECTION. DATA: lv_class_name TYPE string. DATA: lv_data TYPE string. DATA: lo_handler TYPE REF TO zif_handler. 【关键】这个类名是运行时才知道的 真实项目来自配置表 / 接口传入 / 业务场景判断 开发阶段根本不知道会传什么类名 这里是为了程序正常运行手填的假设lv_class_name的字段是WMS调用SAP接口传进来的字段 lv_class_name ZCL_WMS. lv_data 异常数据物料A库存过低. 转大写 TRANSLATE lv_class_name TO UPPER CASE. TRY. 动态创建 这里是为了程序正常运行手填的假设lv_class_name的字段是WMS CREATE OBJECT lo_handler TYPE (lv_class_name). 多态调用 —— 统一入口完全不管实现类是谁 lo_handler-execute( iv_data lv_data ). CATCH cx_root INTO DATA(lx_err). WRITE: / 错误, lx_err-get_text( ). ENDTRY.运行结果WMS 处理 异常数据物料A库存过低五、总结掌握CREATE OBJECT仅仅是探索 ABAP 面向对象编程的一个起点。它在继承、多态、接口和事件驱动编程中都扮演着核心角色。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价