ABAP 语言中,类的属性可以从两个角度来看:
-
从属性的可见性角度,属性可分为
public
,protected
和private
。因为 ABAP 的类自身分为两种,局部类只能在某支程序中定义和使用,也只能在某支程序内可见。这些属性在程序之外是不可见的。全局类(SE24 定义)在外部是可见的,public
,protected
和private
才有意义。- 在全局类中定义的
public
属性,在外部是可见的 - 全局类中定义的
protected
属性,只能在类本身、子类和友元类可见 - 全局类中定义的
private
属性,只能在类本身可见;
- 在全局类中定义的
-
实例属性 (instance attribute) 和静态属性 (static attribute)。
-
实例属性:使用
DATA
关键字来声明,在每个对象中独立存在; -
静态属性:使用
CLASS-DATA
关键字声明,在各个对象之间共享。简单地说,静态属性与类相关,实例属性与对象相关。 - 在调用类和对象的属性和方法的时候,如果是静态属性或方法,用
=>
符号,如果是实例属性或方法,用->
符号。
-
实例属性:使用
借用 BC404 课程的两张图说明静态属性和实例属性的概念和语法要点。
静态属性和实例属性的概念:
接下来实现一个 lcl_student
类,进一步说明 ABAP 类和对象属性的用法。为了代码更加清晰,将类的声明和实现代码放在 include
程序中。
z_lcl_student
include 程序:
CLASS lcl_student DEFINITION.
PUBLIC SECTION.
DATA: sid TYPE char10,
sname TYPE char10.
CLASS-DATA: scount TYPE i.
METHODS: constructor.
ENDCLASS.
" Class implementation
CLASS lcl_student IMPLEMENTATION.
METHOD constructor.
scount = scount + 1.
ENDMETHOD.
ENDCLASS.
在主程序中,创建两个学生对象,在两个学生对象中, sid
和 sname
属性各自有不同的值。学生的数量在构造函数中自动计算。
REPORT z_class_attributes.
INCLUDE Z_LCL_STUDENT.
DATA: lo_stu1 TYPE REF TO lcl_student,
lo_stu2 TYPE REF TO lcl_student.
START-OF-SELECTION.
CREATE OBJECT lo_stu1.
lo_stu1->sid = '001'.
lo_stu1->sname = 'Stone'.
CREATE OBJECT lo_stu2.
lo_stu2->sid = '002'.
lo_stu2->sname = 'Brown'.
WRITE: / lo_stu1->sid, lo_stu1->sname.
WRITE: / lo_stu2->sid, lo_stu2->sname.
WRITE: / 'Student count:', lcl_student=>scount LEFT-JUSTIFIED.
静态属性 scount
在创建对象的时候,constructor 自动将 scount
加一,但如果在调用代码中直接改变,也可以导致学生数量的统计错误。比如,我们在输出之前,故意添加一个赋值语句:
lcl_student=>scount = 10.
WRITE: / 'Student count:', lcl_student=>scount LEFT-JUSTIFIED.
这个时候,输出结果如下图。明明只有两个学生,学生数量却变成了 10:
为了防止外部修改,可以在属性后加上 READ-ONLY
标记。具有 READ-ONLY
标记的属性,只能通过类内部的方法进行修改。
CLASS-DATA: scount TYPE i READ-ONLY.
网友评论