从SAP R/3 4.0版本开始,ABAP就引入了面向对象的开发概念。
ABAP语言的发展
面向对象解决方法中,重点放在了对象结构化或抽象化
类的优点
1.抽象(Abstraction)
2.封装(Encapsulation)
3.继承(Inheritance)
4.多态(Polymorphism)
什么是对象?
CLASS:类是创建对象的模板
OBJECT:对象是指商品/物体/对象/目的,是类的实例
类的区分:
定义类的构成项目(属性、方法、事件)
CLASS<class>DEFINITION.
- 要素声明
- 所有项目都需要定义在三个访问区域之一中
ENDCLASS.
三个访间区域
Public Section.公有部分
内部可见,外部可见
PUBLIC部分的组件,构成类与用户的接口
Protected Section.保护部分
内部可见,继承可见,外部不可见
PROTECTED部分的组件,构成继承类之间的接口
Private Section.私有部分
内部可见,继承不可见,外部不可见
实现类的方法
CLASS<class>IMPLEMENTATION.
...
ENDCLASS.
构成要素的分类
*事件声明
EVENTS evt EXPORTING .. VALUE(e1 e2) TYPE type
*调用事件(Trigger)
RAISE EVENT evt EXPORTING e1 =f1 e2 =f2 ..
*Event Handler声明
METHODS meth FOR EVENT evt OF cif IMPORTING e1 e2
*Event Handler注册/登陆
SET HANDLER h1 h2 [FOR] ..
对象指的是类的实例,每个对象都有自己固有的属性,
一个类可以创建多个对象。
在ABAP程序中要访问对象,需要使用参照对象(0bjectReference),参照对象始终存在于参照对象变量中
DATA obj TYPE REF TO class.
METHOD<meth>
IMPORTING ... <i1>TYPE <type> ....
EXPORTING... <e1>TYPE <type> ..
CHANGING ... <c1>TYPE <type> ...
EXCEPTIONS ... X1...
CALLMETHOD [oref->|class=>]meth
EXPORTING ...i1 = f1...
RECEIVING R = h.
CALL METHOD meth().“没有输入参数
CALL METHOD meth(a).“一个输入
CALL METHOD meth( f1 =a1.....fn=an).“N个输入
- 使用METHODS CONSTRUCTOR定义
- 或使用CLASS-METHODS CLASS CONSTRUCTOR定义
类的继承?
继承的本质是代码重用,当要构造一个新类时,无需从零开始,可以参考一个已有类,在其基础上建立一个新类
参考类:基类/父类。新建类:派生类/子类
派生类可以继承基类所有的属性和方法,并可以在此基础上添加新的特性
CLASS
多态性类继承的实现
由于每个派生类的属性不同,相同的基类对象在不同的派生类中需要以不同的方式来表现,因此提供多态的概念。
在派生类中定义和基类相同的接口,但是可以使用不同的代码来实现。
METHOD <meth> REDEFINITION.
*在派生类中使用基类的方法,使用SUPER:
CALL METHOD SUPER-><meth>.
重载方法,使用ME:
CALL METHOD ME-><meth>.
CLASS<class>DEFINITION ABSTRACT.
...
ENDCLASS.
抽象方法
仅包含方法定义,但没有具体实现的方法,需要通过派生类来实现
METHODS
最终类和最终方法,都是不可继承的
-防止由于设计中多级别派生造成类造成的语法和语义的冲突
CLASS<class> DEFINITION FINAL.
...
ENDCLASS.
METHODS <meth> FINAL.
INTERFACE <intf>
DATA ...
METHOD ...
ENDINTERFACE
CLASS <class> DEFINITION
PUBLIC SECTION .
INTERFACE: int1, int2
ENDCLASS.
class=>intf~attr.
CAll METHOD class=>intf~meth .
接口的申明
"定义接口
INTERFACE INTER.
METHODS WRITE_INTER .
ENDINTERFACE.
*接口中的方法的调用
CALL METHOD LCL_OBJECT->WRITE_INTERFACE.
1.事件(EVENT)
2.定义:可以在类或接口中进行声明
EVENTS|CLASS-EVENTS evt
EXPORTING ... VALUE(P1)TYPE type|LIKE f[OPTIONAL|DEFAULT g] ..
3.触发:一个实例事件可以被类中的任意方法触发,静态事件则可以被静态方
法触发
RAISE EVENT evt EXPORTING p1 = f1 ... pn = fn
4.事件处理:事件需要通过触发其声明代码中所定义的方法才能处理相关事务。
METHODS|CLASS-METHODS
meth FOR EVENT evt OF cif IMPORTING ...ei...
*为相关事件注册方法
SET HANDLER ... hi... [FOR] ...
5.事件类型分为4种
对于实例事件,注册语句必须使用FOR指定注册对象
...FOR ref.
* 注册所有可以触发该事件的实例,包括尚未被创建的实例
...FOR ALL INSTANCES
注册静态事件,不需加FOR后缀,自动应用于整个类
当程序执行到RAISE EVENT语句后,所有已注册的处理方法都将在下一个语句之前被处理。处理方法按照其在系统内部注册的顺序被执行。为避免无限循环,目前事件处理最多不能超过64级嵌套