1, 参数种类
同form一样,OO中的method也可以传递参数,有importing,exporting,changing,returning。
注意:RETURNING :用来替换EXPORTING、CHANGING,不能同时使用。定义了一个形式参数 r 来接收返回值,并且只能是值传递。
参数调用method的语法:
1 2 3 4 5 6 |
[CALL METHOD] meth|me->meth|oref->meth|super->meth|class=>meth[(] [EXPORTING p1 = a1 p2 = a2 ...] { {[IMPORTING p1=a1 p2=a2 ...][CHANGING p1 = a1 p2 = a2 ...]} |[RECEIVING r = a ] }RECEIVING不能与EXPORTING、CHANGING同时使用 [EXCEPTIONS [exc1 = n1 exc2 = n2 ...] [OTHERS = n_others] ] [)]. |
RECEIVING:用来接收METHODS /CLASS-METHODS 中RETURNING选项返回的值
如果EXPORTING、IMPORTING、CHANGING、RECEIVING、EXCEPTIONS、OTHERS同时出现时,应该按此顺序来编写
注:使用此种方式调用(使用 EXPORTING、IMPORTING等这些选项)时,如果原方法声明时带了返回值RETURNING,只能使用RECEIVING来接受,而不能使用等号来接收返回值,下面用法是错误的:
1 |
num2 = o1->m1( EXPORTING p1 = num1 ). |
2, 方法调用方式
method调用分为以下几种形式:
- meth( )
此种方式仅适用于没有输入参数(IMPORTING)、输入\输出参数(CHANGING)、或者有但都是可选的、或 者不是可选时但有默认值也可
- meth( a )
此种方式仅适用于只有一个必选输入参数(IMPORTING)(如果还有其他输入参数,则其他都为可选,或者 不是可选时但有默认值也可),或者是有多个可选输入参数(IMPORTING)(此时没有必选输入参数情况 下)的 情况下但方法声明时通过使用PREFERRED PARAMETER选项指定了其中某个可选参数为首选参数 (首选参数 即在使用meth( a )方式传递一个参数进行调用时,通过实参a传递给设置为首选的参数)
- meth( p1 = a1 p2 = a2 ... )
此种方式适用于有多个必选的输入参数(IMPORTING)方法的调用(其它如CHANGING、EXPORTING没有,或者有但可选),如果输入参数(IMPORTING)为可选,则也可以不必传
Return唯一返回值
1 2 3 4 |
METHODS meth [IMPORTING parameters [PREFERRED PARAMETER p]] RETURNINGVALUE(r) typing [{RAISING|EXCEPTIONS} exc1 exc2 ...]. |
RETURNING :用来替换EXPORTING、CHANGING,不能同时使用。定义了一个形式参数 r 来接收返回值,并且只能是值传递
具有唯一返回值的函数方法可以直接用在以下语句中:逻辑表达式(IF、ELSEIF、WHILE、CHECK、WAIT)、CASE、LOOP、算术表达式、赋值语句
函数方法可以采用上面简单调用方式来调用:meth( )、meth( a )、meth( p1 = a1 P2 = a2 ... )
1 2 3 |
ref->m( RECEIVING r = i ). CALL METHOD ref->m( RECEIVING r = i ). CALL METHOD ref->m RECEIVING r = i. |
方法还可以进行动态调用, 即通过变量对方法名进行指定, 例如下列语句:
1 2 |
meth = accelerate. CALL METHOD ob_veh->(meth). |
实参的动态传递:
1 2 3 |
CALL METHOD [oref->|class=>]meth PARAMETER-TABLE ptab EXCEPTION-TABLE etab. |
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
REPORT ztest_method_para. *&---------------------------------------------------------------------* *& Class vehicle *&---------------------------------------------------------------------* * Text *----------------------------------------------------------------------* CLASS vehicle DEFINITION. PUBLIC SECTION. METHODS:exp_speed IMPORTING cname TYPE string EXPORTING ispeed TYPE i, accelerate IMPORTING rate TYPE i, add CHANGING addone TYPE i. PRIVATE SECTION. DATA speed TYPE i VALUE 0. ENDCLASS. "vehicle *&---------------------------------------------------------------------* *& Class (Implementation) vehicle *&---------------------------------------------------------------------* * Text *----------------------------------------------------------------------* CLASS vehicle IMPLEMENTATION. METHOD accelerate. speed = speed + rate. ENDMETHOD. "accelerate METHOD exp_speed. ispeed = speed. WRITE:/ cname. ENDMETHOD. "show_speed METHOD add. addone = speed + 1 . ENDMETHOD. "add ENDCLASS. "vehicle DATA o_vehicle TYPE REF TO vehicle. DATA:g_speed TYPE i. DATA fname TYPE string VALUE 'Speed = '. START-OF-SELECTION. CREATE OBJECT o_vehicle. CALL METHOD o_vehicle->accelerate EXPORTING rate = 3. CALL METHOD o_vehicle->add CHANGING addone = g_speed. WRITE:g_speed. CALL METHOD o_vehicle->exp_speed EXPORTING cname = fname IMPORTING ispeed = g_speed. WRITE:g_speed. |
以上。
发表评论