【转载】ABAP面向对象(Object Orientation)编程4-类的构造方法(constructor method)

构造函数就是CREATE OBJECT的时候会自动调用的方法(method).分为静态和非静态两种。

1,静态构造方法

语法:

 

1

CLASS-METHODS class_constructor.

静态的构造函数是每个类都已具有的方法,但我们可以通过重定义来完成某些初始化工作

静态的构造器只在程序中被调用一次,即第一次作用该类调用时,且不能被程序显示地调用

该方法也必须在公共部分采用CLASS-METHODS声明,其名称必须是class_constructor,且没有参数(因为不能被显示的调用)

并且在此方法里只能访问类的静态属性

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

REPORT ztest_oo_static_constructor.

CLASS cl_test DEFINITION.

  PUBLIC SECTION.

    CLASS-METHODS: class_constructor .

ENDCLASS.

CLASS cl_test IMPLEMENTATION.

  METHOD: class_constructor.

    WRITE:/ '类已加载'.

  ENDMETHOD.

ENDCLASS.

 

START-OF-SELECTION.

  DATA: go_test TYPE REF TO cl_test.

  "在每一次使用类时,静态的构造函数会自动调用

  CREATE OBJECT go_test.

运行后:

【转载】ABAP面向对象(Object Orientation)编程4-类的构造方法(constructor method)

2,非静态构造方法

语法:

 

1

2

3

METHODS constructor [FINAL]

    [IMPORTING parameters [PREFERRED PARAMETER p]]

    [{RAISING|EXCEPTIONS} exc1 exc2 ...].

构造函数的名是固定的,即为constructor

构造方法默认就是FINAL的,所以没有必要加

构造器必须放在Public段中进行声明

构造方法中不能包含任何形式的输出参数返回值

如果在对象创建并调用构造方法的过程中出现异常,则该对象将被删除

构造函数没有输出参数,只有输入参数,且无返回值

每个类都会有一个默认的无参构造器,但如果重新定义了构造器,则会覆盖默认构造器

在类的创建过程中,有两个特殊的方法,一个是实例的构造函数constructor,该方法在实例创建时隐式的调用;另一个方法是类构造函数class_constructor(静态构造方法),该方法在第一次访问类时被调用,且只调用一次。

如果某个类继承了别的类(Object除外),这个某个类又重新定义了构造器,则一定要在构造器中明确使用super->constructor方法来调用一下父类构造器(否则编辑不通过),只有这样才能保证整个对象被完整地构造出来,因为子类只能正确地构造出属于自己的那部分属性,对于从基类继承来的那部分属性要调用基类中的构造方法来完成。在调用父构造器前,只能访问父类中静态的组件,只有在调用了父类构造器后,才能去访问父中的实例组件。

如果在一个子类里重写了默认构造函数constructor,则在实现时一定要明确的使用CALL METHOD super->constructor.调用一下父类的构造函数,但不一定是在第一句进行调用。

【转载】ABAP面向对象(Object Orientation)编程4-类的构造方法(constructor method)

如果某个类重写了父类某个方法,则在父类构造器中如果调用该方法,调用到的方法还是父类的方法,而不是被重写后的子类方法。

 

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

REPORT ztest_oo_constructor.

CLASS cl_father DEFINITION.

  PUBLIC SECTION.

    METHODS : constructor,

              method_1,

              method_2.

ENDCLASS.

 

CLASS cl_son DEFINITION INHERITING FROM cl_father.

  PUBLIC SECTION.

    METHODS : constructor,

              method_1 REDEFINITION,

              method_2 REDEFINITION.

ENDCLASS.

 

CLASS cl_father IMPLEMENTATION.

  METHOD: constructor.

    "调用的是父类中的方法,而不是子类被重写的方法,

    me->method_1( ).

  ENDMETHOD.

  METHOD: method_1.

    WRITE: / 'father~method_1'.

    "即使不是在父类构造器中调用被重写方法也是这样的,

    me->method_2( ).

  ENDMETHOD.

  METHOD: method_2.

    WRITE: / 'father~method_2'.

  ENDMETHOD.

ENDCLASS.

 

CLASS cl_son IMPLEMENTATION.

  METHOD: constructor.

    super->constructor( ).

    SKIP.

    me->method_1( ).

  ENDMETHOD.

  METHOD: method_1.

    WRITE: / 'son~method_1'.

    me->method_2( ).

  ENDMETHOD.

  METHOD: method_2.

    WRITE: / 'son~method_2'.

  ENDMETHOD.

ENDCLASS.

 

START-OF-SELECTION.

  DATA: go_object TYPE REF TO cl_father.

  CREATE OBJECT go_object TYPE cl_son.

  SKIP.

  go_object->method_1( ).

【转载】ABAP面向对象(Object Orientation)编程4-类的构造方法(constructor method)

另外,不能在构造器中调用抽象方法,所以要想在父类的方法中回调到时子类重定义方法,该被重写的方法一定要是父类中定义的抽象方法,这与设计模式中的模板方法设计模式是相当的,以下是使用ABAP面向对象来实现模板方法设计模式:

 

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

REPORT ztest_oo_constructor_me.

CLASS cl_father DEFINITION ABSTRACT.

  PUBLIC SECTION.

    METHODS: method1,

             method2 ABSTRACT.

ENDCLASS.

 

CLASS cl_son DEFINITION INHERITING FROM cl_father.

  PUBLIC SECTION.

    METHODS: method2 REDEFINITION.

ENDCLASS.

 

CLASS cl_father IMPLEMENTATION.

  METHOD: method1.

    "模板模式:在父类中回调子类实现的父类中所定义的抽象方法

    me->method2( ).

  ENDMETHOD.

ENDCLASS.

 

CLASS cl_son IMPLEMENTATION.

  METHOD: method2."实现父类中定义的抽象方法

    WRITE: / 'son~m2'.

  ENDMETHOD.

ENDCLASS.

 

START-OF-SELECTION.

  DATA: go_object TYPE REF TO cl_father.

  CREATE OBJECT go_object TYPE cl_son.

  SKIP.

  go_object->method1( )."调用继承过来的父类方法

 

3,简单的例子代码

 

ABAP

 

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

REPORT ZTEST_OO_CONSTRUCTOR.

*---------------------------------------------------------------------*

*       CLASS cl_vehicle DEFINITION

*---------------------------------------------------------------------*

*

*---------------------------------------------------------------------*

CLASS cl_vehicle DEFINITION.

  PUBLIC SECTION.

    METHODS: accelerate IMPORTING rate TYPE i,

             constructor IMPORTING i_speed TYPE i,

             show_speed.

  PRIVATE SECTION.

    DATA speed TYPE i VALUE 0.

ENDCLASS.                    "cl_vehicle DEFINITION

*&---------------------------------------------------------------------*

*&       Class (Implementation)  cl_vehicle

*&---------------------------------------------------------------------*

*        Text

*----------------------------------------------------------------------*

CLASS cl_vehicle IMPLEMENTATION.

  METHOD accelerate.

    speed = speed + rate.

  ENDMETHOD.                    "accelertate

  METHOD show_speed.

    WRITE / speed.

  ENDMETHOD.                    "show_speed

  METHOD constructor.

    speed = i_speed.

    WRITE: 'constructor i_speed = ',speed.

  ENDMETHOD.                    "constructor

ENDCLASS.               "cl_vehicle

 

DATA o_vehicle TYPE REF TO  cl_vehicle.

 

START-OF-SELECTION.

  CREATE OBJECT o_vehicle EXPORTING i_speed = 4.

  CALL METHOD o_vehicle->accelerate

    EXPORTING

      rate = 2.

  CALL METHOD o_vehicle->show_speed.

运行结果:

【转载】ABAP面向对象(Object Orientation)编程4-类的构造方法(constructor method)