构造函数就是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. |
运行后:
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.调用一下父类的构造函数,但不一定是在第一句进行调用。
如果某个类重写了父类某个方法,则在父类构造器中如果调用该方法,调用到的方法还是父类的方法,而不是被重写后的子类方法。
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面向对象来实现模板方法设计模式:
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,简单的例子代码
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. |
运行结果:
以上。
发表评论