标签:
2.6.2. PREFERRED PARAMETER首选参数
2.8.5. 示例2. 面向对象 CLASS class DEFINITION [ABSTRACT] [FINAL]. INTERFACE intf. 2 TYPES, DATA, CLASS-DATA, CONSTANTS for data types and data objects 2 METHODS, CLASS-METHODS, EVENTS, CLASS-EVENTS for methods and events 2 INTERFACES(如果在类中,表示需要实现哪个接口;如果是在接口中,表示继承哪个接口) for implementing interfaces 2 ALIASES for alias names for interface components给接口组件取别名 CLASS math DEFINITION. INTERFACE int1. ENDINTERFACE. CLASS class DEFINITION. [?defi?ni??n] CLASS class IMPLEMENTATION. [??mpl?m?n?te?-??n] CLASS <subclass> DEFINITION INHERITING FROM <superclass>. INTERFACE i0. CLASS person DEFINITION. ENDCLASS. CLASS stud DEFINITION INHERITING FROM person. ENDCLASS. START-OF-SELECTION. DATA p TYPE REF TO person. DATA s TYPE REF TO stud. CREATE OBJECT s. p = s. "向上自动转型 "拿开注释运行时抛异常,因为P此时指向的对象不是Student,而是Person所以能强转的前提是P指向的是Student "CREATE OBJECT p. METHODS/CLASS-METHODS meth [ABSTRACT|FINAL] 应该还有一个Returning选项,且RETURNING不能与EXPORTING、CHANGING同时使用: ... { VALUE(p1) | REFERENCE(p1) | p1 } 2 data、object:表示是通用数据类型data、object 2 complete_type:为完全限定类型 2 OPTIONAL与DEFAULT两个选项不能同时使用,且对于EXPORTING类型的输入参数不能使用 2 如果参数名p1前没有使用VALUE、REFERENCE,则默认为还是REFERENCE,即引用传递 2 方法中的输入输出参数是否能修改,请参考Form、Function参数的传值传址 设置多个IMPORTING类型参数中的某一个参数为首选参数。 首选参数的意义在于:当所有IMPORTING类型都为可选optional时,我们可以通过PREFERRED PARAMETER选项来指定某一个可选输入参数为首选参数,则在以下简单方式调用时:[CALL METHOD] meth( a ). 实参a的值就会传递给设置的首选参数,而其他不是首参数的可选输入参数则留空或使用DEFAULT设置的默认值 注:此选项只能用于IMPORTING类型的参数;如果有必选的IMPORTING输入参数,则没有意义了 [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] ] [)]. 如果省略CALL METHOD,则一定要加上括号形式;如果通过CALL METHOD来调用,则括号可加可不加 RECEIVING:用来接收METHODS /CLASS-METHODS 中RETURNING选项返回的值 如果EXPORTING、IMPORTING、CHANGING、RECEIVING、EXCEPTIONS、OTHERS同时出现时,应该按此顺序来编写 注:使用此种方式调用(使用 EXPORTING、IMPORTING等这些选项)时,如果原方法声明时带了返回值RETURNING,只能使用RECEIVING来接受,而不能使用等号来接收返回值,下面用法是错误的: num2 = o1->m1( EXPORTING p1 = num1 ). 此方式下输入的参数都只能是IMPORTING类型的参数,如果要传CHANGING、EXPORTING、RAISING、EXCEPTIONS类型的参数时,只能使用上面通用调用方式。 2 meth( ) 此种方式仅适用于没有输入参数(IMPORTING)、输入\输出参数(CHANGING)、或者有但都是可选的、或者不是可选时但有默认值也可 2 meth( a ) 此种方式仅适用于只有一个必选输入参数(IMPORTING)(如果还有其他输入参数,则其他都为可选,或者不是可选时但有默认值也可),或者是有多个可选输入参数(IMPORTING)(此时没有必选输入参数情况下)的情况下但方法声明时通过使用PREFERRED PARAMETER选项指定了其中某个可选参数为首选参数(首选参数即在使用meth( a )方式传递一个参数进行调用时,通过实参a传递给设置为首选的参数) 2 meth( p1 = a1 p2 = a2 ... ) 此种方式适用于有多个必选的输入参数(IMPORTING)方法的调用(其它如CHANGING、EXPORTING没有,或者有但可选),如果输入参数(IMPORTING)为可选,则也可以不必传 Return唯一返回值 METHODS meth RETURNING :用来替换EXPORTING、CHANGING,不能同时使用。定义了一个形式参数 r 来接收返回值,并且只能是值传递 具有唯一返回值的函数方法可以直接用在以下语句中:逻辑表达式(IF、ELSEIF、WHILE、CHECK、WAIT)、CASE、LOOP、算术表达式、赋值语句 函数方法可以采用上面简单调用方式来调用:meth( )、meth( a )、meth( p1 = a1 P2 = a2 ... ) ref->m( RECEIVING r = i ). 等效于Java中的 this、super EVENTS|CLASS-EVENTS evt [EXPORTING VALUE(p1) 2 data、object:表示是通用数据类型data、object 2 complete_type:为完全限定类型 2 OPTIONAL与DEFAULT两个选项不能同时使用 2 EXPORTING:定义了事件的输出参数,并且事件定义时只能有输出参数,且只能是传值 非静态事件声明中除了明确使用EXPORTING定义的输出外,每个实例事件其实还有一个隐含的输出参数sender,它指向了事件源对象,当使用RAISE EVENT语句触发一个事件时,事件源的对象就会分配给这个sender引用,但是静态事件没有隐含参数sender 事件evt的定义也是在类或接口的定义部分进行定义的 非静态事件只能在非静态方法中触发,而不能在静态方法中触发;而静态事件即可在静态也可在非静态方法中进行触发,或者反过来说:实例方法既可触发静态事件,也可触发非静态事件,但静态方法就只能触发静态事件 RAISE EVENT evt [EXPORTING p1 = a1 p2 = a2 ...]. 该语句只能在定义evt事件的同一类或子类,或接口实现方法中进行调用 当实例事件触发时,如果在event handler事件处理器声明语句中指定了形式参数sender,则会自动接收事件源,但不能在RAISE EVENT …EXPORTING语句中明确指定,它会自动传递(如果是静态事件,则不会传递sender参数) CLASS c1 DEFINITION. 静态或非静态事件处理方法都可以处理静态或非静态事件,与事件的静态与否没有直接的关系 INTERFACE window. "窗口事件接口 实例事件处理器(方法)注册(注:被注册的方法只能是用来处理非静态事件的方法): SET HANDLER handler1 handler2 ... FOR oref|{ALL INSTANCES}[ACTIVATION act]. 静态事件处理器(方法)注册(注:被注册的方法只能是用来处理静态事件的方法): SET HANDLER handler1 handler2 ... [ACTIVATION act]. oref:只将事件处理方法handler1 handler2注册到 oref 这一个事件源对象 ALL INSTANCES:将事件处理方法注册到所有的事件源实例中 ACTIVATION act:表示是注册还是注销 CLASS c1 DEFINITION."事件源 静态(如下面的h1方法)或非静(如下面的h2方法)态事件处理方法都可以处理静态或非静态事件,事件的处理方法是否只能处理静态的还是非静态事件 与 事件的静态与否没有关系,但事件的触发方法 与 事件的静态与否有关系(实例方法既可触发静态事件,也可触发非静态事件,但静态方法就只能触发静态事件);但是,事件处理方法虽然能处理的事件与事件的静态与否没有关系,但如果处理的是静态事件,那此处理方法就成为了静态处理器,只能采用静态注册方式对此处理方法进行注册。如果处理的是非静态事件,那此处理方法就是非静态处理器,只能采用非静态注册方式对此处理方法进行注册 处理器的静态与否与处理方法本身是否静态没有关系,只与处理的事件是否静态有关2.1. 类与接口定义
[PUBLIC SECTION.
[components]]
[PROTECTED SECTION.
[components]]
[PRIVATE SECTION.
[components]]
ENDCLASS.
[components]
ENDINTERFACE. 2.1.1. components
2.2. 类定义、实现
PUBLIC SECTION.
METHODS divide_1_by
IMPORTING operand TYPE i
EXPORTING result TYPE f
RAISING cx_sy_arithmetic_error.
ENDCLASS.
CLASS math IMPLEMENTATION.
METHOD divide_1_by.
result = 1 / operand.
ENDMETHOD.
ENDCLASS.2.3. 接口定义、实现
PUBLICSECTION.
INTERFACES: int1,int2."可实现多个接口
ENDCLASS.
METHOD intf1~imeth1.
ENDMETHOD.
ENDCLASS.2.4. 类、接口继承
METHODS m0.
ENDINTERFACE.
INTERFACE i1.
INTERFACES i0.
"可以有相同的成员名,因为继承过来后,成员还是具有各自的命名空间,在实现时
"被继承过来的叫 i0~m0,在这里的名为i1~m0,所以是不同的两个方法
METHODS m0.
METHODS m1.
ENDINTERFACE.2.5. 向下强转型 ?=
2.6. 方法
[IMPORTING parameters [PREFERRED PARAMETER p]]
[EXPORTING parameters]
[CHANGING parameters]
[{RAISING|EXCEPTIONS} exc1 exc2 ...].2.6.1. parameters
{ TYPE generic_type }
|{TYPE{[LINE OF] complete_type}|{REF TO {data|object|complete_type |class|intf}}}
|{LIKE{[LINE OF] dobj}|{REF TO dobj} }
[OPTIONAL|{DEFAULT def1}]
{ VALUE(p2) | REFERENCE(p2) | p2 }...2.6.2. PREFERRED PARAMETER首选参数
2.6.3. 普通调用
2.6.4. 简单调用
2.6.5. 函数方法
[IMPORTING parameters [PREFERRED PARAMETER p]]
RETURNING VALUE(r) typing
[{RAISING|EXCEPTIONS} exc1 exc2 ...].
CALL METHOD ref->m( RECEIVING r = i ).
CALL METHOD ref->m RECEIVING r = i.2.7. me、super
2.8. 事件
2.8.1. 事件定义
{ TYPE generic_type }
|{TYPE {[LINE OF] complete_type} |
{ REF TO {data|object|complete_type|class|intf}} }
| {LIKE{[LINE OF] dobj} | {REF TO dobj} }
[OPTIONAL|{DEFAULT def1}]
VALUE(p2) ...].2.8.2. 事件触发
PUBLIC SECTION.
EVENTS e1 EXPORTING value(p1) TYPE string value(p2) TYPE i OPTIONAL. "定义
METHODS m1.
ENDCLASS.
CLASS c1 IMPLEMENTATION.
METHOD m1.
RAISE EVENT e1 EXPORTING p1 = ‘...‘. "触发
ENDMETHOD.
ENDCLASS.2.8.3. 事件处理器Event Handler
EVENTS: minimize EXPORTING VALUE(status) TYPE i."最小化事件
ENDINTERFACE.
CLASS dialog_window DEFINITION. "窗口事件实现
PUBLIC SECTION.
INTERFACES window.
ENDCLASS.
INTERFACE window_handler. "窗口事件处理器接口
METHODS: minimize_window FOR EVENT window~minimize OF dialog_window
IMPORTING status sender. "事件处理器方法参数要与事件接口定义中的一致
ENDINTERFACE.2.8.4. 注册事件处理器
2.8.5. 示例
PUBLIC SECTION.
EVENTS: e1 EXPORTING value(p1) TYPE c,e2.
CLASS-EVENTS ce1 EXPORTING value(p2) TYPE i.
METHODS:trigger."事件触发方法
ENDCLASS.
CLASS c1 IMPLEMENTATION.
METHOD trigger.
RAISE EVENT: e1 EXPORTING p1 = ‘A‘,e2,ce1 EXPORTING p2 = 1.
ENDMETHOD.
ENDCLASS.
CLASS c2 DEFINITION."监听器:即事件处理器
PUBLIC SECTION.
"静态方法也可以处理非静态事件,此方法属于非静态处理器,只能采用非静态注册方式
CLASS-METHODS h1 FOR EVENT e1 OF c1 IMPORTING p1 sender.
"非静态方法处理非静态事件,此方法属于非静态处理器,只能采用非静态注册方式
METHODS: h2 FOR EVENT e2 OF c1 IMPORTING sender,
"非静态方法当然更可以处理静态事件,此方法属于静态处理器,只能采用静态注册方式
h3 FOR EVENT ce1 OF c1 IMPORTING p2.
ENDCLASS.
CLASS c2 IMPLEMENTATION.
METHOD h1 .
WRITE: ‘c2=>h1‘.
ENDMETHOD.
METHOD: h2.
WRITE: ‘c2->h2‘.
ENDMETHOD.
METHOD: h3.
WRITE: ‘c2->h3‘.
ENDMETHOD.
ENDCLASS.
DATA: trigger TYPE REF TO c1,
trigger2 TYPE REF TO c1,
handler TYPE REF TO c2.
START-OF-SELECTION.
CREATE OBJECT trigger.
CREATE OBJECT trigger2.
CREATE OBJECT handler.
"由于h1、h2两个处理方法分别是用来处理非静态事件e1、e2的,所以只能采用实例注册方式
SET HANDLER: c2=>h1 handler->h2 FOR trigger,
"h3处理方法是用来处理静态事件ce1的,属于静态处理器,所以只能采用静态注册方式
handler->h3.
trigger->trigger( ).
"虽然trigger( )方法会触发 e1,e2,ce1 三种事件,但h1、h2未向实例trigger2注册,而h3属于静态处理器,与实例无关,即好比向所有实例注册过了一样
trigger2->trigger( ).
标签:
原文地址:http://www.cnblogs.com/jiangzhengjun/p/4264671.html