对于ABAP OO中的静态属性,使用 class-data语句定义(ClASS-DATA attr(属性)[可选]),语句CLASS-DATA只允许被声明在接口或者类中,这个语句定义一个静态属性attr的有效性是和类的实例无关的,只对类的本身有效。所有的类的实例和子类都可以访问这个静态属性。
注意
1. 像所有的在继承中的静态组件,静态属性存在于所有继承父类的子类中。静态的属性,该属性是可见的外部使用类组件选择器可以解决随着它存在的类中的所有的名字。这意味着类在声明的时候已经被定义,举例来说,如何执行构造函数有影响。如果静态属性改变,那么所有的类都会影响,会独立的寻找地址。
2. 你可以访问CLASS-DATA定义的静态属性只用类的名字,而不是接口的名字。
3. 作为一个普通的类,这是他们内部的程序模式是建立在加载类时,共享内存功能的类的静态属性以同样的方式处理,如果不同的程序访问类中静态属性,那么这些动态属性是相互独立的。
4. 动态属性接口可以声明成一个static box,用语句 BOXED.
下面代码是在类vehicle中定义了一个静态属性claaa_name和一个实例属性speed。
CLASS vehicle DEFINITION.
PUBLIC SECTION.
CLASS-DATA class_name(10) TYPE C VALUE 'vehicle'.
PROTECTED SETION.
DATA speed TYPE I.
ENDCLASS.
完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
REPORT ztest_oo_static. *&---------------------------------------------------------------------* *& Class cl_vehicle *&---------------------------------------------------------------------* * Text *----------------------------------------------------------------------* CLASS cl_vehicle DEFINITION. PUBLIC SECTION. CLASS-DATA class_name(10) VALUE 'Vehicle'. METHODS:accelerate,show_speed. PROTECTED SECTION. DATA speed TYPE i. CONSTANTS: pi TYPE p DECIMALS 2 VALUE '3.14'. ENDCLASS. "cl_vehicle *&---------------------------------------------------------------------* *& Class (Implementation) cl_vehicle *&---------------------------------------------------------------------* * Text *----------------------------------------------------------------------* CLASS cl_vehicle IMPLEMENTATION. METHOD accelerate. speed = speed + 1. ENDMETHOD. "accelerate METHOD show_speed. WRITE: / 'Speed:' ,speed. ENDMETHOD. "show_speed ENDCLASS. "cl_vehicle DATA ob_app1 TYPE REF TO cl_vehicle. DATA ob_app2 TYPE REF TO cl_vehicle. DATA ob_app3 TYPE REF TO cl_vehicle. DATA o_vehicle TYPE REF TO cl_vehicle. "引用全局类 START-OF-SELECTION. CREATE OBJECT ob_app1. CREATE OBJECT ob_app2. WRITE: 'ob_app1',ob_app1->class_name. WRITE: / 'ob_app2',ob_app2->class_name. WRITE: / 'vehicle',cl_vehicle=>class_name. "类静态属性 SKIP. * 更改类静态属性 ob_app1->class_name = 'Ship'. WRITE: / 'ob_app1',ob_app1->class_name. WRITE: / 'ob_app2',ob_app2->class_name. WRITE: / 'vehicle',cl_vehicle=>class_name. SKIP. cl_vehicle=>class_name = 'Bus'. CREATE OBJECT ob_app3. WRITE: / 'ob_app3',ob_app3->class_name. CALL METHOD ob_app3->accelerate. CALL METHOD ob_app3->show_speed. CREATE OBJECT o_vehicle. DO 5 TIMES. CALL METHOD o_vehicle->accelerate. ENDDO. CALL METHOD o_vehicle->show_speed. DATA o_vehicle2 LIKE o_vehicle. * 类赋值,对象只要有被引用的变量,就是活动的 o_vehicle2 = o_vehicle. CLEAR o_vehicle. WRITE: '类赋值,对象只要有被引用的变量,就是活动的'. CALL METHOD o_vehicle2->show_speed. |
运行结果:
以上。
感谢大佬的分享,学到了
2019-05-18 8:05 上午