ABAP面向对象
1、类的定义与实现
类定义:
语法:Class <类名> definition.
Public section.
Methods:<方法名> Importing <参数名> type <参数类型>
Exporting <参数名> type <参数类型>.
Endclass.
类实现:
语法:Class <类名> implementation.
Public section.
Method <方法名>.
实现具体代码块.
Endmethod.
Endclass.
2、抽象类
抽象类定义,抽象方法定义,使用Abstract关键字。
示例:
"抽象类定义 "抽象类可以包含静态成员 class-data ,class-methods,class-events "抽象类可以包含非抽象方法 "抽象类可以不定义任何方法 "抽象类 不可以create object 创建实例,但是可以用create object type ref to 创建抽象类引用,并接受子类实例 CLASS base_class DEFINITION ABSTRACT. "抽象类 关键子abstract,基类 PUBLIC SECTION. METHODS:message ABSTRACT "抽象方法 IMPORTING msg TYPE String OPTIONAL. METHODS:sayHello FINAL. "非抽象方法,final方法 METHODS:sayBye. "非抽象方法 ENDCLASS. "抽象类实现,如果抽象类没有非抽象方法,可以没有实现部分 CLASS base_class IMPLEMENTATION. METHOD sayHello. WRITE:/ 'hello world base_class'. ENDMETHOD. METHOD sayBye. WRITE:/ 'bye bye base_class'. ENDMETHOD. ENDCLASS.
3、类继承
使用super类继承base_class类。使用关键字Inheriting from。
示例:
"super类定义,继承基类 "final 方法: "final类中方法,自动识别为final方法,final类不可以定义abstract方法 "非final类中用 final声明final方法,非final类final方法可以被子类继承,但不能重定义 CLASS super_class DEFINITION INHERITING FROM base_class. "继承 inheriting from PUBLIC SECTION. METHODS: message REDEFINITION. "重定义 * METHODS: sayHello REDEFINITION. "final方法不能重定义,编译报错 METHODS: sayBye REDEFINITION. ENDCLASS. "super类实现 CLASS super_class IMPLEMENTATION. METHOD message. WRITE:/ 'super_class:',msg . ENDMETHOD. "final方法不能在子类中重定义,编译报错 * METHOD sayHello. * MESSAGE s000 WITH 'hello world super_class'. * ENDMETHOD. METHOD sayBye. WRITE:/ 'bye bye super_class'. ENDMETHOD. ENDCLASS.
4、Final关键字
使用Final关键字定义final方法,final类。
示例:
"final类定义 "final类:最终类,关键词fianl,不可以再被继承 "final类可以是抽象类,这种情况只能使用它的静态组件 CLASS final_class DEFINITION FINAL INHERITING FROM super_class. PUBLIC SECTION. METHODS:message REDEFINITION. METHODS:message1 IMPORTING msg TYPE String OPTIONAL. ENDCLASS. CLASS final_class IMPLEMENTATION. METHOD message. "调用父类实现方法 CALL METHOD super->message EXPORTING msg = msg. ENDMETHOD. METHOD message1. "通过me->调用当前类其他方法,相当于this,但不要用me->message1,在当前方法,调用他自身 CALl METHOD me->message EXPORTING msg = msg. ENDMETHOD. ENDCLASS.
5、类实例化与调用
类变量定义:
语法:Data:<变量名> type ref to <类名>.
类对象实例化:
语法:create object <变量名>.
这里的变量名相当于一个对应<类名>的实例化对象。
调用方法:
语法:<变量名>-><方法名>(参数1 = 值 [参数2 = 值]).
语法:call method <变量名>-><方法名>(参数1 = 值 [参数2 = 值]).
语法:call method <变量名>-><方法名> exporting <参数> = 值
示例:
"程序开始,main函数 START-OF-SELECTION. DATA base_obj TYPE REF TO base_class. "创建基类引用 DATA final_obj TYPE REF TO final_class. "创建子类引用 "创建子类实例 CREATE OBJECT final_obj. "可以将子类直接付给父类或者基类 base_obj = final_obj. "调用方法 base_obj->message('hello base_obj'). base_obj->sayHello( ). "调用的是基类hello方法,因为hello为final方法,父类可以继承,但没有重写 base_obj->sayBye( ). "调用的是父类的bye方法 "也可这样写 CALL METHOD base_obj->message EXPORTING msg = 'hello base_obj 1'. "OO方法动态调用 DATA meth TYPE String. meth = 'MESSAGE1'. CALL METHOD final_obj->(meth) EXPORTING msg = 'hello final_obj message1'.
6、类的构造
ABAP中构造分类实例构造和静态构造。
示例:
"abap构造器 "abap有实例构造和静态构造, "实例构造:constructor: "方法名固定, "每一次创建对象时调用, "子类自定义constructor中,必须调用super->constructor,父类构造 "静态构造:class_constructor: "方法名固定, "只能被系统调用, "类加载时调用一次, "静态构造只能访问类的静态属性 "构造方法不能被继承,所以不能在子类对构造方法redefination "不能直接用call method 调用构造方法,除非是在子类constructor中,调用super->constructor. "实例构造只有输入importing参数没有exporting参数. "静态构造没有参数. "构造方法必须在public部分定义 "构造方法不能是abstract "静态方法不能被子类重写,除了静态构造。 "父类定义 CLASS super_class DEFINITION. PUBLIC SECTION. DATA msg TYPE String. CLASS-METHODS:class_constructor. "静态构造方法,没有参数 METHODS:constructor IMPORTING msg TYPE String OPTIONAL. "实例构造方法,不能有输出参数 ENDCLASS. "父类实现 CLASS super_class IMPLEMENTATION. METHOD class_constructor. WRITE:/ '父类静态构造方法'. ENDMETHOD. METHOD constructor. me->msg = msg. WRITE:/ msg. WRITE:/ '父类实例构造方法'. WRITE:/ '父类开始初始化'. ENDMETHOD. ENDCLASS. "子类定义 CLASS child_class DEFINITION INHERITING FROM super_class. PUBLIC SECTION. DATA msg1 TYPE String. "子类属性 "静态构造重定义 CLASS-METHODS:class_constructor. "除了静态构造可以重写,不可重写其他静态方法。 "实例构造,不能被重写,因为构造方法不能继承, METHODS:constructor IMPORTING msg TYPE String OPTIONAL msg1 TYPE String OPTIONAL. ENDCLASS. "子类实现 CLASS child_class IMPLEMENTATION. METHOD class_constructor. WRITE:/ '子类静态构造'. ENDMETHOD. METHOD constructor. WRITE:/ msg. WRITE:/ '子类实例构造'. "子类如果自定义实例构造,必须先调用父类constructor,将父类初始化 CALL METHOD super->constructor EXPORTING msg = '子类调用父类实例构造方法'. me->msg1 = msg1. WRITE:/ '子类初始化'. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA child_obj TYPE REF TO child_class. "创建子类引用 CREATE OBJECT child_obj. "创建子类对象
7、接口定义与实现
使用Interface关键字字定义接口。
语法:Interface.
定义方法、变量.
endinterface.
示例:
"接口定义 INTERFACE inter. "接口没有可见性设定,所有方法,属性都是public METHODS: message IMPORTING msg TYPE String OPTIONAL. DATA:str TYPE String. "常量定义,接口属性不能用value给值,常量可以 CONSTANTS:cons TYPE String VALUE '常量'. ENDINTERFACE. "接口不能使用inheriting from继承, CLASS c1 DEFINITION. PUBLIC SECTION. METHODS:output. "直接在类定义 public中声明使用接口, "使用 ALIASES FOR 为接口中组件赋别名 INTERFACES:inter. ALIASES message0 FOR inter~message. ENDCLASS. CLASS c1 IMPLEMENTATION. METHOD:message0. WRITE:/ msg. ENDMETHOD. METHOD:output. WRITE:/ 'test'. ENDMETHOD. ENDCLASS. CLASS c2 DEFINITION. PUBLIC SECTION. INTERFACES:inter. ENDCLASS. CLASS c2 IMPLEMENTATION. METHOD inter~message. WRITE:/ msg. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA inter_obj TYPE REF TO inter. "定义接口引用 DATA c1_obj TYPE REF TO c1. "定义c1类引用 DATA c2_obj TYPE REF TO c2. "定义c2类引用 CREATE OBJECT: c1_obj,c2_obj. "创建类实例 inter_obj = c1_obj. inter_obj->message('c1调用接口'). * inter_obj->output( ). "调用失败,因为c1新定义组件对接口是不可见的 inter_obj = c2_obj. inter_obj->message('c2调用接口'). "调用method写法 * CALL METHOD inter_obj->message('c2调用接口'). * CALL METHOD inter_obj->message * EXPORTING * msg = 'c2调用接口'. * "传入多个参数 * "inter_obj->message(p1 = '' p2 = '' …………).