类的基本知识

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>是不允许的

ABAP_OO基础简介_子类

访问类的属性和方法:

Ø访问静态的类和静态方法(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>,对全局变量进行访问

ABAP_OO基础简介_重定义_02

继承(Inheritance)

Ø继承其实是两种类之间的关系,子类不仅可以继承父类的主要特征,还可以新增自己的属性,方法等。如:汽车就是交通公具的子类。

ØABAP OO里,一个子类只允许有一个父类.

Ø右图为继承的语法

ABAP_OO基础简介_子类_03

在子类中重定义方法,

注意以下点:

1,Redfiniton的声明的Section需与父类的一致

2,重定义的方法的参数不能更改,也不需在子类定义时声明

3,在子类重定义的方法中访问父类的方法,可以用Super->Method访问

4, super->method, 只能在重定义的方法中使用,且method_name称必须是当implementation的方法名

5,静态方法不能被重定义

6,非Private的属性是在父类和子类之间是共用的

ABAP_OO基础简介_子类_04

Casting:

有点类似于field-symbol

1,Narrowing casting

用父类的引用指向子类的实例,可以获取子类实例从父类继承过来的所有特性,但是子类特有的特性获取不到

ABAP_OO基础简介_父类_05

2, Widening casting

用子类的引用指向父类的一个实例.

注意:因为Widening casting不能静态的进行语法较验,只能在程序运行时进行动态语法较验,因此语法上必须用 ?= 或者

Move...? To …

为了避免出现运行时错误,需要使用

   Try…

   catch…

   endtry

来捕获并处理异常

ABAP_OO基础简介_父类_06

Interface

右图中的航空公司,旅馆,租赁公司都提供某些相同的服务,例如:查询合作伙伴,检查是否仍有空闲服务

ABAP_OO基础简介_父类_07

接口中可以定义

属性(Attributes),

方法(Method),

常量(Constants),

类型(Types),

化名(Alias).

但是在接口中所有组件都没有可视的属性

ABAP_OO基础简介_子类_08

复合接口(Compound Interfaces)

注意:Implementation和调用接口中的方法时的语法

<org_interface>-><Method>

ABAP_OO基础简介_父类_09

Events

右图中,当类Car触发Create事件时,其它类就会收到该事件,并做出相应处理.例如:出租车公司登记一辆新车。

ABAP_OO基础简介_重定义_10

说明:

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>.

ABAP_OO基础简介_重定义_11

ABAP_OO基础简介_父类_12

ABAP_OO基础简介_子类_13

ABAP_OO基础简介_父类_14

其它概念

Abstract class:

   *类本身不能被实例化,只有子类能被实例化

   *类中的Abstract method在当前类中不能被implementation,必须在子类中implementation.

Final class:

   * 该类不允许有子类