![]() 实例属性 静态属性 ![]() 组件 ![]() 访问区域;权限 声明项目时,要注意声明访问区域 ![]() 访问实力对象,需要首先声明一个对象。 DATA 名 TYPE REF TO 类。 访问实例属性格式 对象->属性名称 ![]() 调用方法,如下 ![]() 类中定义的变量也可以修改 ![]() 一个类可以有多个实例,多个实例之间相对独立,一个实例修改了值,不会影响其他实例的值。 ![]() 在类中(definition)静态属性声明 ![]() ![]() 在类中(implementation)静态方法实现 ![]() 静态属性的访问,不依附对象,直接通过类=>访问 ![]() 静态方法的访问 ![]() ![]() Class构成要素 ·构成要素的分类 –实例组件(Instance-specific component) ·参照类创建对象时,内存中存在的项目,每次创建对象时都会被初始化。各个类的对象中都存在 ·声明方式:属性:DATA;方法:METHODS。访问:OBJECT->COMP –静态组件(Static component) ·遇到创建类的语句(CREATE OBJECT)开始,直到程序结束都存储于内存中,是依赖类存在的项目。即使不创建对象,若已存在与内存中即可以直接使用。 ·声明方式:属性:CLASS-DATA;方法:CLASS-METHODS。访问:CLASS=>COMP ·类的所有要素在声明部分实现(Class Definition) –属性(Attributes) ·可以拥有ABAP所有数据类型的类内部数据字段,对象状态由属性决定。DATA/CONSTANTS –方法(Method) ·用来定义决定对象行为的类内部执行步骤,可以访问类的所有属性,切可通过方法修改对象的内容,另外,方法提供传入传出参数,便于用户交互 –事件(Event) ·事件是没有继承关系的类之间可以互相调用彼此方法的特殊方法 ![]() 对象 ·对象指的是类的实例,每个对象都有自己固有的属性。 ·一个类可以创建多个对象。 ·在ABAP程序中要访问对象,需要使用参照对象(Object Reference),参照对象始终存在于参照对象变量中 –DATA obj TYPE REF TO class. 方法 ·方法定义的基本语法 –METHOD IMPORTING …TYPE…. EXPORTING…TYPE… CHANGING …TYPE… EXCEPTIONS … X1… –CALL METHOD [oref->|class=>]meth EXPORTING … i1 = f1… RECEIVING R = h . –IMPORT/EXPORT:数据输入/输出接口,接口参数可以参考单个变量,结构,或者内表 –CHANGING:同时作为输入输出接口,接口参数可以参考单个变量,结构,或者内表 –RETURNING:返回类传递数值。该定义不能喝CHANGING/EXPORTING同时使用 –EXCEPTIONS:返回执行中所出现的错误 ·类函数可以拥有多个输入参数,但只能有一个输出参数。类的输出接口参数必须与类函数中所定义类型保持一致 方法的调用 ·当方法没有输出参数(EXPORTING)的时候可以通过以下方式调用: –CALL METHOD meth(). “ 没有输入参数 –CALL METHOD meth( a ). “ 一个输入 –CALL METHOD meth( f1 = a1………fn = an ) . “N个输入 类的继承 ![]() CLASS LCL_SUB DEFINITION INHERITING FROM LCL_COOMPT."类的继承 ENDCLASS. 子类LCL_SUB中没有任何数据;都是继承来自父类LCL_COMPT。 ![]() 子类可以继承 publicsection,protectedsection的内容 privatesection的内容不可以被继承。 ![]() 方法中参数的使用 定义:一个函数导入参数 一个函数传出参数 ![]() 实现(gv_change在这里知识起到一个桥梁的的作用) ![]() 带参函数的调用 ![]() 多个参数的函数调用 ![]() ![]() ![]() 返回类传递数值 即返回值 切 只有一个 ![]() 定义 ![]() 实现 ![]() 调用 ![]() 常量 随意用什么访问 类=>常量名 或者 对象->常量名 进行 访问 ![]() ![]() 访问常量 returning调用的特点 ![]() ![]() ![]() 异常 ![]() ![]() ![]() 构造方法 使用 METHODS CONSTRUCTOR . 每个类只能有一个构造方法,在CREATE OBJECT语句中自动调用构造方法 使用几个create object就调用几次构造方法。 ·什么时候使用构造方法 –需要分配(外部)资源 –需要初始化一些不能用DATA 语句的VALUE 指定的属性值 –需要修改静态属性 –通常不能显式的调用构造器 构造器方法 ![]() 参数要在carete object的时候导入。 ![]() ![]() ·什么是类的继承? –继承的本质是代码重用。当要构造一个新类时,无需从零开始,可以参考一个已有类,再其基础上简历一个新类。 –参考类:基类/父类。新建类:派生类/子类 –派生类可以继承基类所有的属性和方法,并可以在此基础上添加新的特性 ·语句 –CLASSDEFINITION INHERITING FROM. ·多态性类继承的实现 –由于每个派生类的属性不同,相同的基类对象在不同的派生类中需要以不同的方式来表现,因此提供多态的概念。 –在派生类中定义和基类相同的接口,但是可以使用不同的代码来实现。 ·语句 –METHOD 父类方法名REDEFINITION .对父类已有方法的重定义“ –在派生类中使用基类的方法(子类调用父类方法的语句), 使用SUPER:CALL METHOD SUPER->. ![]() –重载方法,使用ME:CALL METHOD ME->. 调用子类的方法 以下两种调用效果类似 ![]() ![]() 抽象类以及方法 抽象类 ·CLASSDEFINITION ABSTRACT . / ENDCLASS . ![]() 抽象类的声明定义 ·抽象方法 –仅包含方法定义,但没有具体实现的方法,需要通过派生类来实现 ·METHODSABSTRACT . ![]() ![]() 抽象类中可以定义实例方法,并实现; 也可以定义抽象方法,但是抽象方法只需定义不需要实现。 非抽象类中不能定义抽象方法 如果需要实现抽象类中的抽象方法;则需要一个类继承抽象类,并且重新定义抽象方法然后实现。 ![]() 接口 –和抽象类相似,定义了一些未实现的属性和方法,所有继承它的类都继承这些成员 –不需要方法实现,不能直接实例化 –接口所有成员都是抽象的 –接口成员一般是公有的 –接口中不能含有构造方法 ![]() 接口的定义;在类之外 ![]() 在类中的publicsection中将接口写进去 在类的实现(implementation)中写出接口中包含的方法的实现。 ![]() METHOD 接口名~(波浪线)方法名. ENDMETHOD. "接口中的方法调用 ![]() CALL METHOD 对象名->接口~方法 若在接口中定义的方法名太长,可以在类定义中的接口中给方法取别名 ![]() ALIASES 别名 FOR 接口名~原方法名.;;在取别名之后, 调用方法就可以直接对象名->方法别名。 不需要加上 接口~ ·事件(EVENT)(事件的发生至少需要两个类) ![]() ·事件类型分为4种 –定义在类中的:实例事件,静态事件 –定义在接口中的:实例事件,静态事件 ·对于实例事件,注册语句必须使用FOR指定注册对象 –… FOR ref . –… FOR ALL INSTANCES(注册所有可以触发该事件的实例,包括尚未被创建的实例) ·注册静态事件,不需加FOR后缀,自动应用于整个类 · ·当程序执行到RAISE EVENT语句后,所有已注册的处理方法都将在下一个语句之前被处理。处理方法按照其在系统内部注册的顺序被执行。为避免无限循环,目前事件处理最多不能超过64级嵌套。 ![]() ![]() 创建方法 查找 数据 若查到就触发事件输出数据 ![]() 触发事件: RAISE EVENT事件名 ![]() 创建一个新类;方法绑定事件;METHODS 名 FOR EVENT 名 OF 类名 导入/导出 数据;;并在实现中写出方法功能 注册是针对 对象 注册 ![]() 新类创建对象;;并注册事件 SET HANDLER 对象名-->方法名 FOR 上一对象名 附录:代码 REPORT ZWEN_0804. *----------------------------------------------------------------------* * INTERFACE INTER IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* INTERFACE INTER."接口 METHODS WRITE_INTER. ENDINTERFACE. "INTER IMPLEMENTATION *----------------------------------------------------------------------* * CLASS LCL_COMPT DEFINITION *----------------------------------------------------------------------* *定义类中的项目(属性;方法;事件) *----------------------------------------------------------------------* CLASS LCL_COMPT DEFINITION. * 如 DATA ------ * 如 MESSAGE ------ * 如 METHODS ------ PUBLIC SECTION."公有 "实例属性 DATA GV_CHAR(10) TYPE C VALUE '实例CHAR变量'. DATA GS_SCHOOL TYPE ZWEN_TEST_SCHOOL. "实例方法 METHODS WRITE_CHAR. TYPES GTY_CHAR10(10) TYPE C . TYPES GTY_CHAR5(10) TYPE C . METHODS SET_VALUE IMPORTING P_VALUE TYPE GTY_CHAR10."对gv——change赋值 METHODS GET_VALUE EXPORTING E_VALUE TYPE GTY_CHAR10."得到gv——change赋值 METHODS CON_VALUE IMPORTING I_VALUE1 TYPE GTY_CHAR5 I_VALUE2 TYPE GTY_CHAR5 I_VALUE3 TYPE GTY_CHAR5 EXPORTING R_SUBRC TYPE GTY_CHAR5. CLASS-DATA GV_CHANGE(10) TYPE C. DATA GV_CONCATENATE TYPE GTY_CHAR10.. "静态属性 CLASS-DATA GV_STATIC(20) TYPE C VALUE '静态属性'. "静态方法 CLASS-METHODS WRITE_STATIC. "接口 INTERFACES INTER. METHODS GET_DATA IMPORTING P_SCHOOL LIKE GS_SCHOOL-ZSCHOOL. "事件 传出 EVENTS DATA_EXIST EXPORTING VALUE(PS_SCHOOL) LIKE GS_SCHOOL. PROTECTED SECTION."保护 CLASS-DATA GV_SUPER TYPE C VALUE 'fuleishuxing'. ENDCLASS . "LCL_COMPT DEFINITION *----------------------------------------------------------------------* * CLASS LCL_HANDLER DEFINITION *----------------------------------------------------------------------* *事件接收器 *----------------------------------------------------------------------* CLASS LCL_HANDLER DEFINITION. PUBLIC SECTION. METHODS WRITE_DATA FOR EVENT DATA_EXIST OF LCL_COMPT IMPORTING PS_SCHOOL."方法绑定事件 ENDCLASS. "LCL_HANDLER DEFINITION *----------------------------------------------------------------------* * CLASS LCL_HANDLER IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS LCL_HANDLER IMPLEMENTATION. METHOD WRITE_DATA. WRITE:/ PS_SCHOOL-ZSCHOOL,PS_SCHOOL-ZSNAME. ENDMETHOD. "WRITE_DATA ENDCLASS. "LCL_HANDLER IMPLEMENTATION *----------------------------------------------------------------------* * CLASS LCL_COPMT IMPLEMENTATION *----------------------------------------------------------------------* *定义类中方法的内容; *----------------------------------------------------------------------* CLASS LCL_COMPT IMPLEMENTATION. "实现实例方法 METHOD WRITE_CHAR. WRITE:/ '调用方法:', GV_CHAR. ENDMETHOD. "WRITE_CHAR METHOD SET_VALUE. GV_CHANGE = P_VALUE. ENDMETHOD. "SET_VALUE METHOD GET_VALUE. E_VALUE = GV_CHANGE. ENDMETHOD. "GET_VALUE *实现静态方法 METHOD WRITE_STATIC. WRITE:/ '静态方法',GV_STATIC. ENDMETHOD. "WRITE_STATIC METHOD CON_VALUE . CONCATENATE I_VALUE1 I_VALUE2 I_VALUE3 INTO GV_CONCATENATE. IF SY-SUBRC = 0. R_SUBRC = 'S'. ELSE. R_SUBRC = 'E'. ENDIF. ENDMETHOD. "CON_VALUE METHOD INTER~WRITE_INTER. WRITE:/ '接口中的方法'. ENDMETHOD. "WRITR_INTER METHOD GET_DATA. SELECT SINGLE * FROM ZWEN_TEST_SCHOOL INTO CORRESPONDING FIELDS OF GS_SCHOOL WHERE ZSCHOOL = P_SCHOOL. IF SY-SUBRC = 0."成功则输出数据 RAISE EVENT DATA_EXIST EXPORTING PS_SCHOOL = GS_SCHOOL."同方向 ELSE."失败 WRITE:/ '取数失败'. ENDIF. ENDMETHOD. "GET_DATA ENDCLASS. "LCL_COPMT IMPLEMENTATION *----------------------------------------------------------------------* * CLASS LCL_SUB DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS LCL_SUB DEFINITION INHERITING FROM LCL_COMPT."类的继承 PUBLIC SECTION. METHODS WRITE_SUPER. ENDCLASS. "LCL_SUB DEFINITION *----------------------------------------------------------------------* * CLASS LCL_SUB IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS LCL_SUB IMPLEMENTATION. METHOD WRITE_SUPER. WRITE:/ '子类输出方法',GV_CHAR."继承父类publicsection属性 WRITE:/ '子类输出方法',GV_SUPER."继承父类PROTECTEDsection属性 ENDMETHOD. "WRITE_SUPER ENDCLASS. "LCL_SUB IMPLEMENTATION "声明一个对象 DATA: LCL_OBJECT TYPE REF TO LCL_COMPT, LCL_OBJECT2 TYPE REF TO LCL_COMPT. START-OF-SELECTION. CREATE OBJECT LCL_OBJECT. CREATE OBJECT LCL_OBJECT2. "实例化 CREATE OBJECT LCL_OBJECT. WRITE:/ '访问实例属性', LCL_OBJECT->GV_CHAR. "修改类中定义的变量 LCL_OBJECT->GV_CHAR = '变化1'. "调用方法 CALL METHOD LCL_OBJECT->WRITE_CHAR. CALL METHOD LCL_OBJECT2->WRITE_CHAR. "静态属性不依附实例 WRITE:/ '访问静态属性',LCL_COMPT=>GV_STATIC. CALL METHOD LCL_COMPT=>WRITE_STATIC."调用静态方法 LCL_COMPT=>GV_STATIC = '修改后的静态属性'."修改惊涛属性 CALL METHOD LCL_COMPT=>WRITE_STATIC. DATA GV_DATA TYPE LCL_OBJECT->GTY_CHAR10. "带有参数方法的调用、 CALL METHOD LCL_OBJECT->SET_VALUE EXPORTING P_VALUE = '赋值操作'. CALL METHOD LCL_OBJECT->GET_VALUE IMPORTING E_VALUE = GV_DATA. WRITE :/ GV_DATA. DATA GV_SUBRC TYPE LCL_OBJECT->GTY_CHAR10. CALL METHOD LCL_OBJECT->CON_VALUE EXPORTING I_VALUE1 = 'HO' I_VALUE2 = 'WD' I_VALUE3 = 'CJ' IMPORTING R_SUBRC = GV_SUBRC. WRITE :/ GV_SUBRC. "接口中的方法调用 CALL METHOD LCL_OBJECT->INTER~WRITE_INTER. "事件的注册及调用 DATA EVENT_HANDLER TYPE REF TO LCL_HANDLER. CREATE OBJECT EVENT_HANDLER. SET HANDLER EVENT_HANDLER->WRITE_DATA FOR LCL_OBJECT."注册事件 CALL METHOD LCL_OBJECT->GET_DATA EXPORTING P_SCHOOL = '211'. |
|
来自: 昵称46169147 > 《abap》