1,传统的ABAP开发:
ABAP 运行环境
报表开发的模块化:
REPORT ZXXXX.
全局变量定义.
内表/工作区定义.
SELETION-SCREEN定义.
INITIALIZATION.
初期化操作.
AT SELECTION-SCREEN.
屏幕事件触发.
START-OF-SELECTION.
主程序流程
END-OF-SELECTION.
结束流程
处理模块(Processing blocks)
1.EVENT blocks
程序构造事件 load-of-program
报表事件 Initialization/start-of-seletion/Get
table/End-of-selection
选择屏幕事件 At selection-screen
清单事件 Top-of-page/End-of-page/At line-
selection/At user-command
屏幕事件 Process before output/process after input
process on help-request /process on value-requset
2.对话模块(Dialog modules)
Modules.
Endmodules.
3.Procedures
From/function/method
ABAP Runtime Environment告诉我们,程序实际上是从一个处理模块跳入到另一个处理模快中去,直到程序被终止或自行结束。
2,OO:
面向对象运行环境:
面向对象实际上是在面向过程的程序中添加的类似于处理模块的语言成分(CLASS)同时在其他处理模块中使用它.
面向对象的程序相对于面向过程的开发的优势:
1.一个好的程序结构
ABAP OO具有更加清晰的语法和语义规则
2.让程序更贴近生活实体
一个物体有什么用处,有什么属性都能通过一个类来表现出来
3.数据的访问更加安全可靠
public/protect/private访问关键字的设定
4.实现了数据的封装和抽象
5.提高代码的重用性
一个类可以生成多个对象,每个对象都能实现类的所有功能
3,Abap object 的简单定义和实现
Class 的含义
CLASS是一系列的具有相同结构和行为的对象的集合.因此类就象一个蓝图,该类中创建的对象都保持一致.换个角度思考,类是面向对象开发的基础, Class 是为了对象而创建的
模板(template),也可以说它就是对象的定义类型.
定义数据:
DATA ABC TYPE CHAR15.
定义内表:
TYPES : BEGIN OF TYXYZ,
…..
END OF TYXYZ.
DATA ITXYZ TYPE TABLE OF TYXYZ.
定义对象
CLASS CL_XYZ DEFINITION.
……..
ENDCLASS.
CLASS CL_XYZ IMPLEMENTATION.
……..
ENDCLASS.
DATA OBJ_XYZ TYPE REF TO CL_XYZ.
CLASS的包含:
在class的定义部分定义类的组件,组件大体包括3种: 属性,方法,事件,只有方法在实现部分实现.
ABAP Object 定义:
CLASS C1 DEFINITION.
PUBLIC SECTION.
DATA: A1…
METHODS: M1….
EVENTS: E1….
PROTECTED SECTION.
DATA:A2…
METHODS:M2..
EVENT:E2…
PRIBATE SECTIONS.
DATA:A3..
METHODS: M3…
EVENT:E3.
ENDCLASS.
实现部分:
CLASS C1 PLEMENTATION.
METHOD M1.
…….
ENDMETHODS.
METHOD M2.
…….
ENDMETHODS.
METHOD M3.
…….
ENDMETHODS..
ENDCLASS.
CLASS组件(静态和动态)
声明动态组件的关键字:
DATA
动态的属性
METHODS
动态的方法
EVENTS
动态的事件
a.动态的组件是存在于类的对象中,使用时采用‘->’.
对象->动态的组件 obj_name->xyz
声明静态组件的关键字:
CLASS-DATA
静态的属性
CLASS-METHODS
静态的方法
CLASS-EVENTS
静态的事件
CONSTANTS
常量
b.静态的组件是只存在于类中,能够被类的对象使用 ,使用时采用‘=>’的方式.
类=>静态的组件class_name=>xyz obj_name=>xyz
类的各个对象实例共享它们的静态属性!!
类的所有组件必须取决于它的可用范围.可用范围包括:公有范围(public),保护范围(protect)
和私有范围(private)
构造器CONSTRUCTOR
A.每个类只有一个构造器
B.运行时在CREATE OBJECT 语句中自动调用构造器
C.必须在PUBLIC SECTION 中定义和应用构造器
另一个的方法名称:
CLASS-METHODS CLASS_CONSTRUCTOR.
当类第一次被访问的时候,这个静态方法会被直接调用,这个方法必须声明在PUBIC块中,
在IMPLEMENTATION中实现。
什么情况下使用构造器
需要分配(外部)资源
需要初始化一些不能用DATA 语句的VALUE 指定的属性值
需要修改静态属性
通常不能显式的调用构造器
对象及对象的引用(object and object reference)
1.声明一个引用变量 ov1.
DATA: OV1 TYPE REF TO CLASS_NAME.
2.创建这个对象,并把对象授权给引用变量.
CREATE OBJECT OV1.
3.使用对象的组件.
WRITE / oref-> int. “读对象属性
CALL METHOD oref-> display_int “调用对象方法
类的自我引用(SELF-REFERENCE)
如果一个对象想提供一个它自己的引用,如给另一个对象使用的时候,能够使用本地的引用关键字”ME”.“ME”是预先定义好的,它总是包含当前对象的地址的引用,如下面例子最终输出:
CLASS c1 DEFINITION.
PUBLIC SECTION.
DATA: int TYPE I VALUE ’10’.
METHODS display_int.
ENDCLASS.
CLASS c1 IMPLEMENTATION.
METHOD display_int.
DATA : int TYPE I VALUE ’20’.
WRITE:/ int,
ME->int.
ENDMETHOD.
ENDCLASS.
DATA : oref TYPE REF TO c1.
CREATE OBJECT oref.
CALL METHOD oref-> display_int.
类的访问方式:
指针内表(Pointer tables),用来存放相同类创建的对象.
DATA: oref TYPE REF TO c1,
oref_tab TYPE TABLE OF REF TO c1.
START-OF-SELECTION.
…
DO 3 TIMES.
CREATE OBJECT oref.
APPEND oref TO oref_tab.
ENDDO.
…
LOOP AT oref_tab INTO oref.
CALL METHOD oref->meth.
ENDLOOP.
方法的使用
1.METHODS的参数接口
METHODS meth1
IMPORTING VALUE(i1) / i1 TYPE type / LIKE dobj DEFAULT def1
EXPORTING VALUE(e1) / e1 TYPE type / LIKE dobj
CHANGING VALUE(c1)/ c1 TYPE type /LIKE dobj DEFAULT def2
EXCEPTIONS x1
2.METHODS的调用
CALL METHODS oref1 ->meth1
[ EXPOTING i1 = a1…….in = an ]
[ IMPOTING e1 = a1…….en = an ]
[ CHANGING c1 = a1…….cn = an ]
[ EXCEPTION x1 = r1 …. Other = rn]
a1到an为实际参数
方法的调用:
当方法没有输出参数(EXPORTING)的时候可以通过以下方式调用:
CALL METHOD meth(). “ 没有输入参数
CALL METHOD meth( a ). “ 一个输入
CALL METHOD meth( f1 = a1………fn = an ) . “N个输入
Function Methods的应用:
我们想象函数调用一样使用方法,可以定义一个方法如下:
METHODS meth
IMPORTING VALUE(i1)/i1 TYPE type/LIKE dobj
[OPTIONAL/DEFAULT def1]
RETURNING VALUE(R) TYPE type /LIKE dobj
一个功能方法(Function Methods)有一堆IMPORING参数和一个RETURNING参数,并且
RETURNING的值必须是VALUE传递,同时必须被定义TYPE或LIKE.
CALL METHOD oref->meth
EXPORTING i1 = a1…..in = an
RETURNING R = A.
调用格式:
oref-> meth(). “ 没有输入参数
oref-> meth( a ). “ 一个输入
oref-> meth( f1 = a1………fn = an ) . “N个输入。
4,实例:
Create a vehicle class
创建一个类 ZCL_VEHICLE_XX . 这个类下面属性SPEED 和 MAX_SPEED表示VEHICLE 的速度和最大速度。以及有SPEED_UP, STOP, 和 SHOW三个方法。
方法 SPEED_UP 有 IMPORTING parameter STEP. 表示加速的程度,但不能超过最大速度。方法STOP则表示使速度为零。方法WRITE用来输出当前速度和最大速度。
/SE80:
回车,鼠标右键创建:
弹出窗口,填入相应信息:
注意此时Final不能勾选。 保存:
按照如下要求构建类:
PUBLIC SECTION.
METHODS constructor.
METHODS speed_up
IMPORTING
step TYPE i.
METHODS stop.
METHODS show.
PROTECTED SECTION.
DATA: speed TYPE i,
max_speed TYPE i VALUE 50.
PRIVATE SECTION.
DATA id TYPE i .
CLASS-DATA object_count TYPE i.
METHOD constructor.
object_count = object_count + 1.
id = object_count.
ENDMETHOD.
METHOD show.
data msg type string.
data: temp_id type string,
temp_speed type string,
temp_max_speed type string.
temp_id = id.
temp_speed = speed.
temp_max_speed = max_speed.
concatenate ’Vehicle’ temp_ID ’,Speed = ’ temp_speed ’,max_speed = ’ temp_max_speed ’.’
into msg.
message msg type ’I’.
ENDMETHOD.
METHOD speed_up.
speed = speed + step.
IF speed > max_speed.
speed = max_speed.
ENDIF.
ENDMETHOD.
METHOD stop.
speed = 0.
ENDMETHOD.
激活后,实例化ZCL_VEHICLE_XX。
Create an application class : ZCL_APPLICATION_XX。
右键放置classes上选择create:
填入相应信息保存:
按照如下信息构建classes:
PUBLIC SECTION.
CLASS-METHODS start.
PROTECTED SECTION.
PRIVATE SECTION.
METHOD start.
DATA vehicle TYPE REF TO zcl_vehicle_xx.
DATA vehicle_tab LIKE TABLE OF vehicle.
DATA tabindex TYPE i.
DO 10 TIMES.
CREATE OBJECT vehicle.
APPEND vehicle TO vehicle_tab.
ENDDO.
LOOP AT vehicle_tab INTO vehicle.
tabindex = sy-tabix * 10.
vehicle->speed_up( tabindex ).
vehicle->show( ).
ENDLOOP.
ENDMETHOD.
构建好了如下:
F8运行程序:
OVER。