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 = '' …………).
来源:oschina
链接:https://my.oschina.net/u/4398200/blog/3336236