ABAP 面向对象编程

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.
 

Guess you like

Origin blog.csdn.net/weixin_45689053/article/details/121631169