文章目录
8. ABAP 面向对象编程
8.1 与面向过程编程的区别
待总结,刚看完面向过程ABAP,个人感觉像C语言中的主函数调用子函数。
面向对象呢,就是封装啊,继承啊,一些比较复杂的概念。
回头补。
8.2 回顾ABAP变量和数据类型
数据类型:就是一个变量装啥样的数据。
变量:声明了一个变量,它就会指向内存一块地方来保留数据的值。就是说我要一块地方。
在变量声明过程中指定的数据类型,操作系统会分配内存,决定怎么在内存中来保存这个数据。
插播: 字和字节的区别
bit: binary digit(二进制数)的简写,要么是1,要么是0,是指最小的数据单位。就是个有电没电的电路信号。
byte:一字节等于8bit。为啥?一开始美国人搞的ASCII码,127位就囊括了所有数字,字母和特殊字符。对于美国人来讲,这个ASCII码的127位就用8个bit就够了。所以byte作为内存或者外部存储的最小单位。(后来有扩展)
1MB = 8Mb
bit 一般用来衡量速度:Mbps
这个意思是,一秒内把多少位字从一个设备给移到另一个设备。宽带10Mbps就是这个意思。一秒就有这么多bit到你手机上。为啥用bit来衡量速度,不用byte? 你发送出去的数据,比如邮件一般都是被分解成数据包,然后从不同方向发送,最后到达别人的接收处是顺序混乱需要重排的。所以呢,这种不稳定的数据流不好划分字节,那就用比特衡量。
byte 用来衡量大小:MB
相对于内存来说,1 byte是最小存储单元。硬盘,U盘和系统内存一般用这个单位。软件大小也按这个来衡量。
那么比如HI这个单词,就需要两个字节。Hello就需要5个字节。
插播结束
现在回到ABAP的数据类型。
基本数据类型就有以下这么多。有些是定长的,有些是不定长的。
比如说定义一个I整型的,那系统就会指定4个字节空间给你,那么你的这个数字最大就是± 2的31次方。
对于一个字符的,我觉得也是1byte。只不过对于字符型的,直接用字符作为大小。65535个byte。
还有些可以参照这里:别人写的.
8.3 面向对象中的概念
8.3.1 继承
就是说类和别人分享自己的结构和方法
8.3.2 多态
共用一个沟通接口的不同对象
8.3.3 事件
用来对对象作出反应及触发事件
8.4 类
类要定义后实现。
类似于C语言要定义类的对象和方法。同时对象也有公有私有。
在ABAP中定义类,对象就是attribute,还有types,interface可以定义。等等。
8.4.1 类的定义
CLASS user DEFINITION.
PUBLIC SECTION.
DATA: name TYPE c LENGTH 30,
age TYPE i,
gender TYPE c LENGTH 1 READ-ONLY.
CLASS-DATA : count TYPE i.
PRIVATE SECTION.
DATA : loginid TYPE c LENGTH 20,
pwd TYPE c LENGTH 15.
ENDCLASS.
类的定义中还有方法:
作为一个BW工作者,经常在转换里面看到:
methods GLOBAL_END
importing
!REQUEST type RSREQUEST
!DATAPACKID type RSDATAPID
!SEGID type RSBK_SEGID
exporting
!MONITOR type RSTR_TY_T_MONITORS
changing
!RESULT_PACKAGE type _ty_t_TG_1
raising
CX_RSROUT_ABORT
CX_RSBK_ERRORCOUNT .
methods NEW_RECORD__END_ROUTINE
importing
!SOURCE_SEGID type RSTRAN_SEGID default 0001
!SOURCE_RECORD type SYTABIX
exporting
!RECORD_NEW type SYTABIX .
在类的方法定义中。
Import: 就是传给这个方法的值。
export:就是从方法中传出去的值。
changing:就是两者皆有,传入到方法的值,最后更改后再传出。
raising:啥例外。
注意,方法的定义也是在类中的,实际上endclass应该在方法定义结束之后。
8.4.2 属性
就是类中的数据字段,对象。在类声明的时候声明。在不同的位置,比如public section,private section。私有的就是说,只有我类里面的组件能访问,比如类里面的方法。类之外的不行。
属性分为对象实例和静态属性。
对象实例用DATA声明。上面的例子里有。
静态属性用CLASS-DATA声明。如果静态属性改了,大家都能看到。所以这个家伙在public区。
8.4.3 方法
类中的对象的行为。方法可以访问类的属性。就是说它定义的对象空间。方法里面可以包含参数。当你去call这个method的时候,就传入数值给这个方法。方法的声明在类的声明里,实现在类的实现里。METHOD…ENDMETHOD。
如果是静态方法也是一样的用CLASS-METHOD。
不同的就是静态方法调用的时候是用以下语法。
call method classname=>methodname
实例方法的调用如下:如果只import一个参数,那就把参数放在圆括号里,括号前没有空格,括号后有空格。
classname->methodname( data )
如果方法里不止import一个参数,那就用形参=实参成对的把实参赋值给形参。
classname->methodname( param1 = data1 param2 = data2 ).
如果不是只import参数进去,那就把参数的类型也带上:
注意这里export和import是反着来的。
因为你是call别人的方法。就是说我在这里call一个方法去干活。就是我叫一个小弟去干活。那我要export一个指令给他去。到他那边呢,他就接了也就是import了这个指令。等他除了完了export出来然后我再接进来,就是import进来。
如果你call的那个method是returning, 我们这边call的就是receiving。
calssname->methodname( EXPORTING param1 = data1 param2 = data2
IMPORTING param3 = data3 param4 = data4
CHANGING param5 = data5 param6 = data6).
```
懂了这些我觉得我一个搞BW的差不多能看懂代码了。
说实话我看到这里我觉得对我来说又是知识盲区了。我觉得我得去把C语言捡起来了。
```java
REPORT ztest.
CLASS user DEFINITION.
PUBLIC SECTION.
DATA: name TYPE c LENGTH 30,
age TYPE i,
gender TYPE c LENGTH 1 READ-ONLY,
status TYPE c LENGTH 1.
CLASS-DATA : count TYPE i.
METHODS setname
IMPORTING namein TYPE c.
METHODS getname
EXPORTING nameout TYPE c.
METHODS setstatus
CHANGING newstatus TYPE c.
METHODS getstatustext
IMPORTING VALUE(statcode) TYPE c
RETURNING VALUE(stattext) TYPE string.
PRIVATE SECTION.
DATA : loginid TYPE c LENGTH 20,
pwd TYPE c LENGTH 15.
ENDCLASS.
CLASS user IMPLEMENTATION.
METHOD setname.
name = namein.
ENDMETHOD.
METHOD getname.
nameout = name.
ENDMETHOD.
METHOD setstatus.
IF newstatus CO 'MF'.
status = newstatus.
newstatus = '1'.
ELSE.
newstatus = '2'.
ENDIF.
ENDMETHOD.
METHOD getstatustext.
CASE statcode.
WHEN '1'.
stattext = 'Male'.
WHEN '2'.
stattext = 'Female'.
WHEN OTHERS.
stattext = 'Unknown'.
ENDCASE.
ENDMETHOD.
ENDCLASS.
CLASS car DEFINITION.
PUBLIC SECTION.
CLASS-DATA carnum TYPE i.
METHODS setnumseats
IMPORTING numseat TYPE i.
METHODS gofaster
IMPORTING increment TYPE i
EXPORTING result TYPE i.
METHODS goslower
IMPORTING decrement TYPE i
RETURNING VALUE(result) TYPE i.
PRIVATE SECTION.
DATA: make TYPE c LENGTH 20,
model TYPE c LENGTH 20,
seatsnum TYPE i,
speed TYPE i,
maxsped TYPE i.
ENDCLASS.
CLASS car IMPLEMENTATION.
METHOD setnumseats.
seatsnum = numseat.
ENDMETHOD.
METHOD gofaster.
DATA temspeed type i.
temspeed = speed + increment.
IF temspeed <= maxsped.
result = temspeed.
ELSE.
result = maxspeed.
ENDIF.
ENDMETHOD.
METHOD goslower.
DATA temspeed type i.
temspeed = speed - decrement.
IF speed >= 0.
result = temspeed.
ELSE.
result = 0.
ENDIF.
ENDMETHOD.
ENDCLASS.
REPORT ztest.
CLASS car DEFINITION.
PUBLIC SECTION.
CLASS-DATA carnum TYPE i.
METHODS constructor
IMPORTING
make TYPE c
model TYPE c
seatsnum TYPE i
speed TYPE i
maxsped TYPE i.
METHODS viewcar.
METHODS setnumseats
IMPORTING numseat TYPE i.
METHODS gofaster
IMPORTING increment TYPE i
EXPORTING result TYPE i.
METHODS goslower
IMPORTING decrement TYPE i
RETURNING VALUE(result) TYPE i.
PRIVATE SECTION.
DATA: make TYPE c LENGTH 20,
model TYPE c LENGTH 20,
seatsnum TYPE i,
speed TYPE i,
maxsped TYPE i.
ENDCLASS.
CLASS car IMPLEMENTATION.
METHOD constructor.
me->make = make. " make是constructor的参数, me->make是对象的属性
me->model = model.
me->seatsnum = seatsnum.
me->speed = speed.
me->maxsped = maxsped.
carnum = carnum + 1.
ENDMETHOD.
METHOD viewcar.
WRITE:/ make.
WRITE:/ model.
ENDMETHOD.
METHOD setnumseats.
seatsnum = numseat.
ENDMETHOD.
METHOD gofaster.
IF speed >= maxsped.
result = speed.
ELSE.
result = speed + increment.
ENDIF.
ENDMETHOD.
METHOD goslower.
IF speed >= 0.
result = speed - decrement.
ELSE.
result = 0.
ENDIF.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA car1 TYPE REF TO car.
CREATE OBJECT car1
EXPORTING
make = 'AUDI'
model = 'A4'
seatsnum = 5
speed = 60
maxsped = 120.
uline.
8.4.4 接口
接口是啥呢?用来干啥的呢?
当两个相似的类有个同名的方法,但是不同的功能。就上接口了。
接口有点像类,但是接口中的方法是在类中实现的,是对类的扩展。实现接口后,接口将成为类的公有成员,接口加上继承,是多态的基础。就是说啥呢?
在一个接口中定义的方法在不同类中有不同的实现,接口没有自己的实例, 因而也不需要进行方法实现。
INTERFACE <intf_name>.
DATA.....
CLASS-DATA.....
METHODS.....
CLASS-METHODS.....
ENDINTERFACE.