类的基本知识
1. 类的基本知识
A, 声明类
CLASS c1 DEFINITION
ENDCLASS.
B, 可见性设置
PUBLIC SECTION.
对Class内部及外部都可见
PROTECTED SECTION
对Class内部可见
对于子类可见
PRIVATE SECTION.
只对Class内部可见
C,声明类的属性和方法:
DATA Var1 TYPE string.
METHODS m1 IMPORTING im_1 TYPE string.
CLASS-DATA pi TYPE i. 静态属性
CLASS-METHODS m3. 静态方法
说明:
* 一个类静态属性在一个程序中只存在一个,也就是说该类的所有实例都共用一个静态属性
* Public section中的属性可以设置为READ-ONLY,表示该属性只有Class内部能够修改,外部只能读取。
D,类的实现:
CLASS c1 IMPLEMENTATION
ENDCLASS.
在类的实现中实现方法:
METHOD m1.
...
ENDMETHOD.
构造函数constructor
声明:
* Method constructor importing <im_parameter>
exceptions <exception>.
说明:
* 每一个class都有一个构造函数
* 构造函数在Create object 时自动调用
* 构造函数必须在Public section中声明
* 如果异常发生,将不会产生实例.
* CLASS-METHODS class_constructor
importing <im_parameter>
exceptions <exception>.
说明:
* Static constructor在类被第一次被访问时执行,且在程序中只执行一次
* Static constructor不能被显式的访问
<class>-><static_constructor>是不允许的
访问类的属性和方法:
Ø访问静态的类和静态方法(static attribute and static method)
<class_name>=> <static_attribute>
<class_name>=> <static_Method>
Ø访问实例的属性和方法
Call method <instance>-><Instance_method>
exporting <im_var> = <var>
importing <im_var> = <var>
changing <im_var> = <var>
receiving <re_var> = <var>
exceptions <exception> = <nr>.
或者 <instance>-><Instance_method>([additions])
访问属性: var = <instance>-><public_attributes>.
其它规则
1, 在Class中,Attributes, methods, events,Types, Constants, ALIAS names共用一个命名空间,因此它们之间的名字是不能重复的
2, 在Method中,定义的局部变量的名字(Local space)可以与全局变量(Global namespace)重得,但是如果重复后,如果需要在该Method内访问全局变量,可以使用Me-><glabal_attributes>,对全局变量进行访问
继承(Inheritance)
Ø继承其实是两种类之间的关系,子类不仅可以继承父类的主要特征,还可以新增自己的属性,方法等。如:汽车就是交通公具的子类。
ØABAP OO里,一个子类只允许有一个父类.
Ø右图为继承的语法
在子类中重定义方法,
注意以下点:
1,Redfiniton的声明的Section需与父类的一致
2,重定义的方法的参数不能更改,也不需在子类定义时声明
3,在子类重定义的方法中访问父类的方法,可以用Super->Method访问
4, super->method, 只能在重定义的方法中使用,且method_name称必须是当implementation的方法名
5,静态方法不能被重定义
6,非Private的属性是在父类和子类之间是共用的
Casting:
有点类似于field-symbol
1,Narrowing casting
用父类的引用指向子类的实例,可以获取子类实例从父类继承过来的所有特性,但是子类特有的特性获取不到
2, Widening casting
用子类的引用指向父类的一个实例.
注意:因为Widening casting不能静态的进行语法较验,只能在程序运行时进行动态语法较验,因此语法上必须用 ?= 或者
Move...? To …
为了避免出现运行时错误,需要使用
Try…
catch…
endtry
来捕获并处理异常
Interface
右图中的航空公司,旅馆,租赁公司都提供某些相同的服务,例如:查询合作伙伴,检查是否仍有空闲服务
接口中可以定义
属性(Attributes),
方法(Method),
常量(Constants),
类型(Types),
化名(Alias).
但是在接口中所有组件都没有可视的属性
复合接口(Compound Interfaces)
注意:Implementation和调用接口中的方法时的语法
<org_interface>-><Method>
Events
右图中,当类Car触发Create事件时,其它类就会收到该事件,并做出相应处理.例如:出租车公司登记一辆新车。
说明:
1,Instance Event的声明: Event
2, Static events的声明: Class-events
3,注册event handler:
对于Static events: SET HANDLER <handler_method>.
对于Instance events: SET HANDLER <handler_method> for <reference>.
其它概念
Abstract class:
*类本身不能被实例化,只有子类能被实例化
*类中的Abstract method在当前类中不能被implementation,必须在子类中implementation.
Final class:
* 该类不允许有子类