[SAP ABAP] 面向对象程序设计-属性和方法

属性( Attributes) :对象的属性及特征
方法( Method ):定义对象的行为

从对象属性和方法是属于类还是属于对象的实例,可以区分为静态属性(static attributes) / 静态方法(static methods),实例属性(instance attributes) / 实例方法(instance methods)

1.静态属性和方法

静态属性

通过 CLASS-DATA 关键字进行声明,通过类名以及 => 符号进行调用

静态方法

通过 CLASS-METHODS 关键字进行声明,通过类名以及 => 符号进行调用

静态属性和方法属于类本身,在各个对象实例之间是共享的,通过类名来访问,调用的时候,不需要创建对象的实例

例1 

REPORT z437_test_2025.

* 静态属性和方法的定义
CLASS lcl_math DEFINITION.
  PUBLIC SECTION.
    TYPES: ty_double TYPE p LENGTH 10 DECIMALS 2.
    CLASS-DATA pi TYPE p LENGTH 10 DECIMALS 7 VALUE '3.1415926'.

    CLASS-METHODS: pow IMPORTING x TYPE ty_double
                                 y TYPE ty_double
                       RETURNING VALUE(pow_value) TYPE ty_double.
ENDCLASS.

CLASS lcl_math IMPLEMENTATION.
  METHOD pow.
    pow_value = x ** y.
  ENDMETHOD.
ENDCLASS.

* 静态属性和方法的访问
START-OF-SELECTION.
  DATA: result TYPE p DECIMALS 2.

  CALL METHOD lcl_math=>pow
    EXPORTING
      x         = 25
      y         = 3
    RECEIVING
      pow_value = result.

*  result = lcl_math=>pow( x = 25 y = 3 ).

  WRITE: / 'pi = ', lcl_math=>pi LEFT-JUSTIFIED,
         / '25 ** 3 = ', result LEFT-JUSTIFIED.

输出结果:

在ABAP中,类中定义方法,返回方法的结果值需要使用RETURNING VALUE(xxx)

方法定义 IMPORTING  调用时对应 EXPORTING
方法定义 RETURNING 调用时对应 RECEIVING

2.实例属性和方法 

实例属性

实例属性属于对象的实例(object instance),通过DATA关键字进行声明,通过对象变量以及 ->符号进行调用

实例中的属性是相互独立的

实例方法

实例方法属于对象的实例(object instance),通过METHODS关键字进行声明,通过对象变量以及 ->符号进行调用

例1

REPORT z437_test_2025.

* 实例属性和方法的定义
CLASS lcl_student DEFINITION.
  PUBLIC SECTION.
    METHODS: constructor IMPORTING sid           TYPE string
                                   name          TYPE string
                                   age           TYPE int2
                                   current_class TYPE string.

    METHODS: set_age   IMPORTING new_age   TYPE int2,
             set_class IMPORTING new_class TYPE string,
             to_string RETURNING VALUE(rv) TYPE string.

  PRIVATE SECTION.
    DATA: sid           TYPE string,
          name          TYPE string,
          age           TYPE int2,
          current_class TYPE string.
ENDCLASS.                              " lcl_student DEFINITION

CLASS lcl_student IMPLEMENTATION.
  METHOD constructor.
    me->sid = sid.
    me->name = name.
    me->age = age.
    me->current_class = current_class.
  ENDMETHOD.                           " constructor

  METHOD set_age.
    me->age = new_age.
  ENDMETHOD.                           " set_age

  METHOD set_class.
    me->current_class = new_class.
  ENDMETHOD.                           " set_class

  METHOD to_string.
    DATA: result TYPE string.
    DATA: age_str TYPE string.

    age_str = me->age.

    CONCATENATE '<Student: (ID:' me->sid ',Name:' me->name ',Age:' age_str',Class:' me->current_class ')>'
      INTO result.

    rv = result.
  ENDMETHOD.

ENDCLASS.                             " lcl_student IMPLEMENTATION


* 实例属性和方法的访问
START-OF-SELECTION.
  DATA: stu_info TYPE string.
  " 定义引用类型的变量
  DATA: s1 TYPE REF TO lcl_student.

  " 创建对象的实例
  " 在本例中,构造函数有4个参数,方法定义时关键字为IMPORTING,调用时对应EXPORTING关键字
  CREATE OBJECT s1 EXPORTING sid = '001'
                             name = 'Andy'
                             age = 18
                             current_class = '卓越21班'.

  " 调用对象的属性和方法
  CALL METHOD s1->set_age
    EXPORTING
      new_age = 20.

*  s1->set_age( 20 ).

  CALL METHOD s1->set_class
    EXPORTING
      new_class = '卓越A班'.

*  s1->set_class( '卓越A班' ).

  stu_info = s1->to_string( ).

  WRITE: / stu_info.

输出结果:

构造方法(constructor)是一类特殊的方法,在创建对象实例时,构造方法自动运行

例2

REPORT z437_test_2025.

CLASS lcl_demo DEFINITION.
  PUBLIC SECTION.
    " 实例属性
    DATA: gv_first_name TYPE c LENGTH 100 VALUE 'Instance Class'.

    " 静态属性
    CLASS-DATA: gv_last_name TYPE c LENGTH 100 VALUE 'Static Class'.

    " 实例方法
    METHODS: write_instance.

    " 静态方法
    CLASS-METHODS: write_static.

ENDCLASS.

CLASS lcl_demo IMPLEMENTATION.
  METHOD write_instance.
    WRITE: / '实例属性', gv_first_name.
    WRITE: / '静态属性', gv_last_name.
    ULINE.
  ENDMETHOD.

  METHOD write_static.
    WRITE: / '静态方法里的静态属性',gv_last_name.
  ENDMETHOD.
ENDCLASS.


START-OF-SELECTION.
  " 定义变量
  DATA: lo_f_1 TYPE REF TO lcl_demo,
        lo_f_2 TYPE REF TO lcl_demo.

  " 实例化
  CREATE OBJECT lo_f_1.
  CREATE OBJECT lo_f_2.

  " 实例中的属性是相互独立的
  lo_f_1->gv_first_name = '1'.
  lo_f_2->gv_first_name = '2'.

  " 访问实例方法
  lo_f_1->write_instance( ).
  lo_f_2->write_instance( ).

  WRITE: / '访问静态属性', lcl_demo=>gv_last_name.
  ULINE.

  " 访问静态方法
  lcl_demo=>write_static( ).

输出结果:

总结

① 静态属性和方法与类相关,实例属性/方法与对象实例相关

② 静态属性和方法通过类名 + => 符号进行调用

     实例属性和方法通过对象变量 + -> 符号进行调用

提示Tips:静态属性和方法不能访问实例属性和方法,实例属性和方法能访问静态属性和方法

补充扩展:方法的定义与调用

方法定义的基本语法
METHODS <meth>
    IMPORTING … <i1> TYPE <type> …
    EXPORTING … <e1> TYPE <type> …
    CHANGING  … <c1> TYPE <type> …
    RETURNING … <r1> TYPE <type> …
    EXCEPTIONS … X1 …
IMPORTING :数据输入 ,参数可以参考单个变量,结构或者内表
EXPORTING :数据 输出,参数可以参考单个变量,结构或者内表
CHANGING: 同时作为输入输出接口,\参数可以参考单个变量,结构或者内表
RETURNING :返回类传递数值,该定义不能和 CHANGING / EXPORTING 同时使用
EXCEPTIONS :返回执行中所出现的错误
提示Tips: 方法可以拥有多个输入参数,但只能有一个输出参数

方法调用的基本语法

CALL METHOD [oref->|class=>] meth
    EXPORTING i1 = f1… 
    RECEIVING R = h.

当方法没有输出参数(EXPORTING)的时候可以通过以下方式调用: 

CALL METHOD meth().  "  没有输入参数
CALL METHOD meth( a ).  "  一个输入参数
CALL METHOD meth( f1 = a1………fn = an ) .  " n 个输入参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值