ABAP 类 🏗️ 类概述 定义 类用于指定对象的形式,它将数据表示和将该数据操作为一个整齐包的方法组合。类中的数据和函数称为类 的成员。
类的作用 类定义时,可以为数据类型定义蓝图:
不定义具体数据,而是定义类名称的意义
定义对象将包括什么
定义可以对对象执行的操作
定义对象的抽象特性(属性、字段和方法)
📝 类定义和实现 类定义语法 1 2 3 4 CLASS <class_name> DEFINITION. .......... .......... ENDCLASS.
类实现语法 1 2 3 4 CLASS <class_name> IMPLEMENTATION. ........... .......... ENDCLASS.
类的结构
graph TD
A[类定义] --> B[属性]
A --> C[方法]
A --> D[事件]
A --> E[类型]
A --> F[常量]
C --> C1[实例方法]
C --> C2[静态方法]
注意事项
类的实现包含其所有方法的实现
在类声明中声明方法,在类实现部分实现
ABAP对象中,类的结构包含属性、方法、事件、类型和常量等组件
🏷️ 属性 属性概述 属性是可以具有任何数据类型(如C、I、F和N)的类的数据字段。它们在类声明中声明。
属性类型 1. 实例属性 1 2 * 定义实例属性 DATA: mv_text TYPE char20 VALUE 'Instance Data'.
特点 :
定义对象的实例特定状态
不同对象的状态不同
使用DATA语句声明
2. 静态属性 1 2 * 定义静态属性 CLASS-DATA: mv_shared_text TYPE char20 VALUE 'Shared Data'.
特点 :
定义由类的所有实例共享的类的公共状态
更改一个对象的静态属性,对类的所有其他对象也可见
使用CLASS-DATA语句声明
🔧 方法 方法概述 方法是表示类中的对象的行为的函数或过程。类的方法可以访问类的任何属性。
方法实现语法 1 2 3 4 METHOD <m_name>. .......... .......... ENDMETHOD.
方法调用 可以使用CALL METHOD语句调用方法:
1 CALL METHOD: object->method_name.
方法参数 1 2 3 4 5 6 * 方法定义包含参数 METHODS: calculate_discount IMPORTING iv_amount TYPE p EXPORTING ev_discount TYPE p CHANGING cv_total TYPE p.
👁️ 访问控制 可见性部分 类组件可以在控制如何访问这些组件的公共、私有或受保护的可见性部分中定义。
1. Public(公共部分) 1 2 3 PUBLIC SECTION. DATA: mv_public_data TYPE string. METHODS: public_method.
特点 :
可以从任何上下文访问
可以由该类和程序的任何其他类、子类访问
默认情况下,所有成员都是私有的
2. Protected(受保护部分) 1 2 3 PROTECTED SECTION. DATA: mv_protected_data TYPE string. METHODS: protected_method.
特点 :
3. Private(私有部分) 1 2 3 PRIVATE SECTION. DATA: mv_private_data TYPE string. METHODS: private_method.
特点 :
访问控制示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 REPORT zaccess1. CLASS class1 DEFINITION. PUBLIC SECTION. DATA: text1 TYPE char25 VALUE 'Public Data'. METHODS meth1. PROTECTED SECTION. DATA: text2 TYPE char25 VALUE 'Protected Data'. PRIVATE SECTION. DATA: text3 TYPE char25 VALUE 'Private Data'. ENDCLASS. CLASS class1 IMPLEMENTATION. METHOD meth1. WRITE: / 'Public Method:', / text1, / text2, / text3. SKIP. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA: objectx TYPE REF TO class1. CREATE OBJECT: objectx. CALL METHOD: objectx->meth1. WRITE: / objectx->text1.
输出示例 1 2 3 4 5 6 Public Method: Public Data Protected Data Private Data Public Data
🔒 静态属性 静态属性定义 静态属性用语句CLASS-DATA声明。所有对象或实例都可以使用类的静态属性。
访问方式 静态属性直接在类名的帮助下访问:
1 class_name=>name_1 = 'Some Text'
静态属性示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 REPORT ZStatic1. CLASS class1 Definition. PUBLIC Section. CLASS-DATA: name1 TYPE char45, data1 TYPE i. Methods: meth1. ENDCLASS. CLASS class1 Implementation. Method meth1. Do 4 Times. data1 = 1 + data1. Write: / data1, name1. EndDo. Skip. EndMethod. ENDCLASS. START-OF-Selection. class1=>name1 = 'ABAP Object Oriented Programming'. class1=>data1 = 0. Data: Object1 TYPE REF TO class1, Object2 TYPE REF TO class1. Create Object: Object1, Object2. CALL Method: Object1->meth1, Object2->meth1.
输出结果
⚙️ 构造函数 构造函数概述 构造函数是在创建对象或访问类的组件时自动调用的特殊方法。
特点
每当创建对象时,构造器被触发
需要调用方法来触发一般方法
用于初始化对象的状态
构造函数示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 REPORT ZConstructor1. CLASS class1 Definition. PUBLIC Section. Methods: method1, constructor. ENDCLASS. CLASS class1 Implementation. Method method1. Write: / 'This is Method1'. EndMethod. Method constructor. Write: / 'Constructor Triggered'. EndMethod. ENDCLASS. START-OF-Selection. Data Object1 TYPE REF TO class1. Create Object Object1.
输出结果
🔄 ME运算符 ME运算符概述 当在类的public节中声明任何类型的变量时,可以在任何其他实现中使用它。
工作原理
变量可以在public section中用初始值声明
可以在具有不同值的方法中再次声明该变量
使用”ME”运算符可以获取类级别的变量值
直接声明获得方法级别的变量值
ME运算符示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 REPORT ZMEOperator1. CLASS class1 Definition. PUBLIC Section. Data text1 TYPE char25 Value 'This is CLASS Attribute'. Methods method1. ENDCLASS. CLASS class1 Implementation. Method method1. Data text1 TYPE char25 Value 'This is METHOD Attribute'. Write: / ME->text1, / text1. EndMethod. ENDCLASS. START-OF-Selection. Data objectx TYPE REF TO class1. Create Object objectx. CALL Method objectx->method1.
输出结果 1 2 This is CLASS Attribute This is METHOD Attribute
ME运算符的使用 1 2 3 4 5 6 7 8 " 使用ME访问类属性 METHOD my_method. " ME-> 确保访问的是类的属性,而不是局部变量 ME->mv_attribute = 'New Value'. " 如果没有ME,可能会访问局部变量 mv_attribute = 'Local Value'. ENDMETHOD.
💡 类的完整示例 完整类定义 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 REPORT z_class_example. * 类定义 CLASS zcl_car DEFINITION. PUBLIC SECTION. " 公共属性 DATA: make TYPE string, model TYPE string, speed TYPE i, max_speed TYPE i VALUE 200. " 公共方法 METHODS: constructor IMPORTING iv_make TYPE string iv_model TYPE string, accelerate IMPORTING iv_amount TYPE i RAISING cx_speed_limit, brake IMPORTING iv_amount TYPE i, get_speed RETURNING(value(rv_speed)) TYPE i. PROTECTED SECTION. " 受保护属性 DATA: engine_on TYPE abap_bool, fuel TYPE p LENGTH 16 DECIMALS 2 VALUE 50.0. PRIVATE SECTION. " 私有方法 METHODS: check_fuel RAISING cx_insufficient_fuel, update_fuel IMPORTING iv_consumption TYPE p. ENDCLASS. * 类实现 CLASS zcl_car IMPLEMENTATION. METHOD constructor. me->make = iv_make. me->model = iv_model. me->speed = 0. me->engine_on = abap_true. WRITE: / 'Created:', me->make, me->model. ENDMETHOD. METHOD accelerate. me->check_fuel( ). IF iv_amount > 0. me->speed = me->speed + iv_amount. IF me->speed > me->max_speed. me->speed = me->max_speed. RAISE EXCEPTION TYPE cx_speed_limit. ENDIF. me->update_fuel( iv_amount / 10 ). ENDIF. ENDMETHOD. METHOD brake. IF iv_amount > 0. me->speed = me->speed - iv_amount. IF me->speed < 0. me->speed = 0. ENDIF. ENDIF. ENDMETHOD. METHOD get_speed. rv_speed = me->speed. ENDMETHOD. METHOD check_fuel. IF me->fuel < 10.0. RAISE EXCEPTION TYPE cx_insufficient_fuel. ENDIF. ENDMETHOD. METHOD update_fuel. me->fuel = me->fuel - iv_consumption. IF me->fuel < 0. me->fuel = 0. ENDIF. ENDMETHOD. ENDCLASS. * 使用示例 START-OF-SELECTION. DATA: lo_car TYPE REF TO zcl_car. CREATE OBJECT lo_car EXPORTING iv_make = 'BMW' iv_model = 'X5'. lo_car->accelerate( 50 ). WRITE: / 'Current Speed:', lo_car->get_speed( ). lo_car->brake( 20 ). WRITE: / 'After Braking:', lo_car->get_speed( ).
⚠️ 注意事项 1. 访问控制
合理使用PUBLIC、PROTECTED、PRIVATE部分
数据通常放在PRIVATE部分
方法放在PUBLIC部分以便外部调用
2. 性能考虑
避免过度使用静态属性
合理使用构造函数进行初始化
注意ME运算符的使用场景
3. 错误处理
使用异常类处理错误
在构造函数中进行必要验证
提供清晰的错误信息