分享

ABAP面向对象总结

 昵称46169147 2017-08-07
clipboard.png

实例属性  静态属性

clipboard.png

组件

clipboard.png

访问区域;权限

声明项目时,要注意声明访问区域

clipboard.png

访问实力对象,需要首先声明一个对象。  DATA 名   TYPE REF TO  类。

访问实例属性格式 对象->属性名称

clipboard.png

调用方法,如下

clipboard.png

类中定义的变量也可以修改

clipboard.png

一个类可以有多个实例,多个实例之间相对独立,一个实例修改了值,不会影响其他实例的值。

clipboard.png

在类中(definition)静态属性声明

clipboard.png

clipboard.png

在类中(implementation)静态方法实现

clipboard.png

静态属性的访问,不依附对象,直接通过类=>访问

clipboard.png

静态方法的访问

clipboard.png

clipboard.png

Class构成要素

·构成要素的分类

–实例组件(Instance-specific component)

·参照类创建对象时,内存中存在的项目,每次创建对象时都会被初始化。各个类的对象中都存在

·声明方式:属性:DATA;方法:METHODS。访问:OBJECT->COMP

–静态组件(Static component)

·遇到创建类的语句(CREATE OBJECT)开始,直到程序结束都存储于内存中,是依赖类存在的项目。即使不创建对象,若已存在与内存中即可以直接使用。

·声明方式:属性:CLASS-DATA;方法:CLASS-METHODS。访问:CLASS=>COMP

·类的所有要素在声明部分实现(Class Definition)

–属性(Attributes)

·可以拥有ABAP所有数据类型的类内部数据字段,对象状态由属性决定。DATA/CONSTANTS

–方法(Method)

·用来定义决定对象行为的类内部执行步骤,可以访问类的所有属性,切可通过方法修改对象的内容,另外,方法提供传入传出参数,便于用户交互

–事件(Event)

·事件是没有继承关系的类之间可以互相调用彼此方法的特殊方法

clipboard.png

对象

·对象指的是类的实例,每个对象都有自己固有的属性。

·一个类可以创建多个对象。

·在ABAP程序中要访问对象,需要使用参照对象(Object Reference),参照对象始终存在于参照对象变量中

–DATA    obj TYPE REF TO class.

方法

·方法定义的基本语法

–METHOD

IMPORTING …TYPE….

EXPORTING…TYPE…

CHANGING …TYPE…

EXCEPTIONS … X1…

–CALL METHOD [oref->|class=>]meth

EXPORTING … i1 = f1…

RECEIVING       R  = h .

–IMPORT/EXPORT:数据输入/输出接口,接口参数可以参考单个变量,结构,或者内表

–CHANGING:同时作为输入输出接口,接口参数可以参考单个变量,结构,或者内表

–RETURNING:返回类传递数值。该定义不能喝CHANGING/EXPORTING同时使用

–EXCEPTIONS:返回执行中所出现的错误

·类函数可以拥有多个输入参数,但只能有一个输出参数。类的输出接口参数必须与类函数中所定义类型保持一致

方法的调用

·当方法没有输出参数(EXPORTING)的时候可以通过以下方式调用:

–CALL METHOD meth().  “ 没有输入参数

–CALL METHOD meth( a ). “ 一个输入

–CALL METHOD meth( f1 = a1………fn = an ) . “N个输入

类的继承

clipboard.png

CLASS LCL_SUB DEFINITION INHERITING FROM LCL_COOMPT."类的继承

ENDCLASS.   

子类LCL_SUB中没有任何数据;都是继承来自父类LCL_COMPT。

clipboard.png

子类可以继承  publicsection,protectedsection的内容

privatesection的内容不可以被继承。

clipboard.png

方法中参数的使用

定义:一个函数导入参数  一个函数传出参数

clipboard.png

实现(gv_change在这里知识起到一个桥梁的的作用)

clipboard.png

带参函数的调用

clipboard.png

多个参数的函数调用

clipboard.png

clipboard.png

clipboard.png

返回类传递数值   即返回值 切 只有一个

clipboard.png

定义

clipboard.png

实现

clipboard.png

调用

clipboard.png

常量  随意用什么访问   类=>常量名   或者 对象->常量名  进行 访问

clipboard.png

clipboard.png

访问常量

returning调用的特点

clipboard.png

clipboard.png

clipboard.png

异常

clipboard.png

clipboard.png

clipboard.png

构造方法

使用 METHODS  CONSTRUCTOR . 

每个类只能有一个构造方法,在CREATE OBJECT语句中自动调用构造方法

使用几个create object就调用几次构造方法。

·什么时候使用构造方法

–需要分配(外部)资源

–需要初始化一些不能用DATA 语句的VALUE 指定的属性值

–需要修改静态属性

–通常不能显式的调用构造器

构造器方法

clipboard.png

参数要在carete object的时候导入。

clipboard.png

clipboard.png

·什么是类的继承?

–继承的本质是代码重用。当要构造一个新类时,无需从零开始,可以参考一个已有类,再其基础上简历一个新类。

–参考类:基类/父类。新建类:派生类/子类

–派生类可以继承基类所有的属性和方法,并可以在此基础上添加新的特性

·语句

–CLASSDEFINITION INHERITING FROM.

·多态性类继承的实现

–由于每个派生类的属性不同,相同的基类对象在不同的派生类中需要以不同的方式来表现,因此提供多态的概念。

–在派生类中定义和基类相同的接口,但是可以使用不同的代码来实现。

·语句

–METHOD 父类方法名REDEFINITION .对父类已有方法的重定义“

–在派生类中使用基类的方法(子类调用父类方法的语句),

使用SUPER:CALL METHOD SUPER->.

clipboard.png

–重载方法,使用ME:CALL METHOD ME->.

调用子类的方法   以下两种调用效果类似

clipboard.png

clipboard.png

抽象类以及方法

抽象类

·CLASSDEFINITION ABSTRACT .  / ENDCLASS .

clipboard.png

抽象类的声明定义

·抽象方法

–仅包含方法定义,但没有具体实现的方法,需要通过派生类来实现

·METHODSABSTRACT .

clipboard.png

clipboard.png

抽象类中可以定义实例方法,并实现;

也可以定义抽象方法,但是抽象方法只需定义不需要实现。

非抽象类中不能定义抽象方法

如果需要实现抽象类中的抽象方法;则需要一个类继承抽象类,并且重新定义抽象方法然后实现。

clipboard.png

接口

–和抽象类相似,定义了一些未实现的属性和方法,所有继承它的类都继承这些成员

–不需要方法实现,不能直接实例化

–接口所有成员都是抽象的

–接口成员一般是公有的

–接口中不能含有构造方法

clipboard.png

接口的定义;在类之外

clipboard.png

在类中的publicsection中将接口写进去

在类的实现(implementation)中写出接口中包含的方法的实现。

clipboard.png

METHOD 接口名~(波浪线)方法名.

ENDMETHOD.

"接口中的方法调用

clipboard.png

CALL METHOD  对象名->接口~方法

若在接口中定义的方法名太长,可以在类定义中的接口中给方法取别名

clipboard.png

ALIASES 别名 FOR 接口名~原方法名.;;在取别名之后,

调用方法就可以直接对象名->方法别名。

不需要加上   接口~

·事件(EVENT)(事件的发生至少需要两个类)

clipboard.png

·事件类型分为4种

–定义在类中的:实例事件,静态事件

–定义在接口中的:实例事件,静态事件

·对于实例事件,注册语句必须使用FOR指定注册对象

–… FOR ref .

–… FOR ALL INSTANCES(注册所有可以触发该事件的实例,包括尚未被创建的实例)

·注册静态事件,不需加FOR后缀,自动应用于整个类

·

·当程序执行到RAISE EVENT语句后,所有已注册的处理方法都将在下一个语句之前被处理。处理方法按照其在系统内部注册的顺序被执行。为避免无限循环,目前事件处理最多不能超过64级嵌套。

clipboard.png

clipboard.png

创建方法  查找 数据  若查到就触发事件输出数据

clipboard.png

触发事件:

RAISE EVENT事件名

clipboard.png

创建一个新类;方法绑定事件;METHODS  名 FOR EVENT  名 OF  类名  导入/导出  数据;;并在实现中写出方法功能

注册是针对 对象 注册

clipboard.png

新类创建对象;;并注册事件   SET  HANDLER   对象名-->方法名  FOR  上一对象名

附录:代码

REPORT ZWEN_0804.

*----------------------------------------------------------------------*

*       INTERFACE INTER IMPLEMENTATION

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

INTERFACE INTER."接口

METHODS WRITE_INTER.

ENDINTERFACE.                    "INTER IMPLEMENTATION

*----------------------------------------------------------------------*

*       CLASS LCL_COMPT DEFINITION

*----------------------------------------------------------------------*

*定义类中的项目(属性;方法;事件)

*----------------------------------------------------------------------*

CLASS LCL_COMPT  DEFINITION.

* 如 DATA ------

* 如 MESSAGE ------

* 如 METHODS ------

PUBLIC SECTION."公有

"实例属性

DATA GV_CHAR(10) TYPE C VALUE '实例CHAR变量'.

DATA GS_SCHOOL TYPE ZWEN_TEST_SCHOOL.

"实例方法

METHODS WRITE_CHAR.

TYPES GTY_CHAR10(10) TYPE C .

TYPES GTY_CHAR5(10) TYPE C .

METHODS SET_VALUE IMPORTING P_VALUE TYPE GTY_CHAR10."对gv——change赋值

METHODS GET_VALUE EXPORTING E_VALUE TYPE GTY_CHAR10."得到gv——change赋值

METHODS CON_VALUE IMPORTING I_VALUE1 TYPE GTY_CHAR5

I_VALUE2 TYPE GTY_CHAR5

I_VALUE3 TYPE GTY_CHAR5

EXPORTING R_SUBRC TYPE GTY_CHAR5.

CLASS-DATA GV_CHANGE(10) TYPE C.

DATA GV_CONCATENATE TYPE GTY_CHAR10..

"静态属性

CLASS-DATA GV_STATIC(20) TYPE C VALUE '静态属性'.

"静态方法

CLASS-METHODS WRITE_STATIC.

"接口

INTERFACES INTER.

METHODS GET_DATA IMPORTING P_SCHOOL LIKE GS_SCHOOL-ZSCHOOL.

"事件    传出

EVENTS DATA_EXIST EXPORTING VALUE(PS_SCHOOL) LIKE GS_SCHOOL.

PROTECTED SECTION."保护

CLASS-DATA  GV_SUPER   TYPE C VALUE 'fuleishuxing'.

ENDCLASS .                    "LCL_COMPT DEFINITION

*----------------------------------------------------------------------*

*       CLASS LCL_HANDLER DEFINITION

*----------------------------------------------------------------------*

*事件接收器

*----------------------------------------------------------------------*

CLASS LCL_HANDLER DEFINITION.

PUBLIC SECTION.

METHODS WRITE_DATA FOR EVENT DATA_EXIST OF LCL_COMPT

IMPORTING PS_SCHOOL."方法绑定事件

ENDCLASS.                    "LCL_HANDLER DEFINITION

*----------------------------------------------------------------------*

*       CLASS LCL_HANDLER IMPLEMENTATION

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

CLASS LCL_HANDLER IMPLEMENTATION.

METHOD WRITE_DATA.

WRITE:/ PS_SCHOOL-ZSCHOOL,PS_SCHOOL-ZSNAME.

ENDMETHOD.                    "WRITE_DATA

ENDCLASS.                    "LCL_HANDLER IMPLEMENTATION

*----------------------------------------------------------------------*

*       CLASS LCL_COPMT IMPLEMENTATION

*----------------------------------------------------------------------*

*定义类中方法的内容;

*----------------------------------------------------------------------*

CLASS LCL_COMPT IMPLEMENTATION.

"实现实例方法

METHOD WRITE_CHAR.

WRITE:/  '调用方法:', GV_CHAR.

ENDMETHOD.                    "WRITE_CHAR

METHOD SET_VALUE.

GV_CHANGE = P_VALUE.

ENDMETHOD.                    "SET_VALUE

METHOD GET_VALUE.

E_VALUE =   GV_CHANGE.

ENDMETHOD.                    "GET_VALUE

*实现静态方法

METHOD WRITE_STATIC.

WRITE:/   '静态方法',GV_STATIC.

ENDMETHOD.                    "WRITE_STATIC

METHOD CON_VALUE .

CONCATENATE I_VALUE1 I_VALUE2 I_VALUE3 INTO  GV_CONCATENATE.

IF SY-SUBRC = 0.

R_SUBRC = 'S'.

ELSE.

R_SUBRC = 'E'.

ENDIF.

ENDMETHOD.                    "CON_VALUE

METHOD INTER~WRITE_INTER.

WRITE:/ '接口中的方法'.

ENDMETHOD.                    "WRITR_INTER

METHOD GET_DATA.

SELECT SINGLE * FROM ZWEN_TEST_SCHOOL

INTO CORRESPONDING FIELDS OF GS_SCHOOL

WHERE ZSCHOOL = P_SCHOOL.

IF SY-SUBRC = 0."成功则输出数据

RAISE EVENT DATA_EXIST

EXPORTING

PS_SCHOOL = GS_SCHOOL."同方向

ELSE."失败

WRITE:/ '取数失败'.

ENDIF.

ENDMETHOD.                    "GET_DATA

ENDCLASS.                    "LCL_COPMT IMPLEMENTATION

*----------------------------------------------------------------------*

*       CLASS LCL_SUB DEFINITION

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

CLASS LCL_SUB DEFINITION INHERITING FROM LCL_COMPT."类的继承

PUBLIC SECTION.

METHODS WRITE_SUPER.

ENDCLASS.                    "LCL_SUB DEFINITION

*----------------------------------------------------------------------*

*       CLASS LCL_SUB IMPLEMENTATION

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

CLASS LCL_SUB IMPLEMENTATION.

METHOD WRITE_SUPER.

WRITE:/ '子类输出方法',GV_CHAR."继承父类publicsection属性

WRITE:/ '子类输出方法',GV_SUPER."继承父类PROTECTEDsection属性

ENDMETHOD.                    "WRITE_SUPER

ENDCLASS.                    "LCL_SUB IMPLEMENTATION

"声明一个对象

DATA: LCL_OBJECT TYPE REF TO LCL_COMPT,

LCL_OBJECT2 TYPE REF TO LCL_COMPT.

START-OF-SELECTION.

CREATE OBJECT LCL_OBJECT.

CREATE OBJECT LCL_OBJECT2.

"实例化

CREATE OBJECT LCL_OBJECT.

WRITE:/ '访问实例属性', LCL_OBJECT->GV_CHAR.

"修改类中定义的变量

LCL_OBJECT->GV_CHAR = '变化1'.

"调用方法

CALL METHOD LCL_OBJECT->WRITE_CHAR.

CALL METHOD LCL_OBJECT2->WRITE_CHAR.

"静态属性不依附实例

WRITE:/ '访问静态属性',LCL_COMPT=>GV_STATIC.

CALL METHOD LCL_COMPT=>WRITE_STATIC."调用静态方法

LCL_COMPT=>GV_STATIC = '修改后的静态属性'."修改惊涛属性

CALL METHOD LCL_COMPT=>WRITE_STATIC.

DATA GV_DATA TYPE LCL_OBJECT->GTY_CHAR10.

"带有参数方法的调用、

CALL METHOD LCL_OBJECT->SET_VALUE

EXPORTING

P_VALUE = '赋值操作'.

CALL METHOD LCL_OBJECT->GET_VALUE

IMPORTING

E_VALUE = GV_DATA.

WRITE :/  GV_DATA.

DATA GV_SUBRC TYPE LCL_OBJECT->GTY_CHAR10.

CALL METHOD LCL_OBJECT->CON_VALUE

EXPORTING

I_VALUE1 = 'HO'

I_VALUE2 = 'WD'

I_VALUE3 = 'CJ'

IMPORTING

R_SUBRC  = GV_SUBRC.

WRITE :/  GV_SUBRC.

"接口中的方法调用

CALL METHOD LCL_OBJECT->INTER~WRITE_INTER.

"事件的注册及调用

DATA EVENT_HANDLER TYPE REF TO LCL_HANDLER.

CREATE OBJECT EVENT_HANDLER.

SET HANDLER EVENT_HANDLER->WRITE_DATA FOR LCL_OBJECT."注册事件

CALL METHOD LCL_OBJECT->GET_DATA

EXPORTING

P_SCHOOL = '211'.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多