ABAP面相对象

2022-09-23  本文已影响0人  SAP杰

对象

方法

继承

接口

事件

类生成器

实例:

根据类创建过程中为实例化,且根据类的创建对象为实例,对象代表所有实例总体的概念,而实例创建出来的类的具体概念

Class : 类是创建对象设计图者模块

Object : 对象指的商品对象目的

Object Reference : 程序内用于访问对象属性的方法

Attrribute : 对象具备的属性以及特征

Method : 定义的对象行为

Event : 用于不同类之间相互访问的方法

类:

可以看成是对象的骨髓或者是对象的类型,

全局/本地类:

ABAP对象可以定义全局,本地 类 在abap工作区中利用事物代码SE24定义全局类与全局接口

DEFINITION:定义类的结构属性(属性,方法,事件)

IMPLEMENTATION: 实现类的方法

输出结果是:

结果

CLASS构成要素:

 类要在所有要素声明部分实现,构成要素在类定义对象的属性定义类,各个项目需求定义三个区域之一,访问区域定义类之间的外部接口 类的所有项目中均可视.但是根据声明方式不同,有的项目无法在其他类中使用,类的所有项目在同一个NameSpace中,这意味着各个项目都有唯一的名字

类存在的要素一种是各个类的对象中都存在,另一种是与实例数无关,整个类就存在一,前者是实例,该项目是参照创建等一下时,内存中存在的项目,每次创建对象时都会被初始化后者是NON实例项目,也叫静态组件,该项目从遇到创建类的语句,开始直到结束都存储到内存中,是依赖存在的目的 static属性用与Class-data语句声明,Static方法用于Class-Method方法声明,static属性和方法为了类组件而声明的,即是不创建对象,也可以直接使用。

属性:

属性是拥有ABAP所有数据类型的类内部的数据字段,对象状态是由属性的内容决定的

实例属性的组件定义Instance-specific对象状态

在类中可以使用DATA语句声明此类属性

属性类型:

DATA :                实例属性

CLASS-DATA :    静态属性

方法:

方法用来决定对象行为的类的内部执行步骤,方法可以访问类的所有属性,,并且通过方法来修改内容,另外还提供传入和传出参数,方便用户交互,在这方面类似于FuctionModule

METHOD meth.

ENDMETHOD.

用于METHODS语句来声明实例方法,该方法所在的类的属性中均可访问

用于CLASS-METHODS声明静态方法,只能访问静态方法

用于SPECIAl METHODS 此方法用的不多。

方法类型:

METHODS                   INSTANCE METHOD

CLASS-METHODS       Static METHOD

CONSTRUCTOR          SPECIAI METHOD

CLASS-CONSTRUCTOR

EVENTS

简单案例

输出结果:SET输出结果

IMPORTING : 传入方法

EXPORTING : 传出方法

声明方法部分(METHODS)的IMPORTING, EXPORTING分别是类方法的传入和传出的参数语句

与PERFORM里的USING,CHANGING类似

事件(EVENT)

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

通过CALL METHOD语句调用一般的方法

事件声明

EVENTS evt EXPORTING .. VALUE(e1,e2) TYPE type [OPTIONAL]

调用事件

RALSE EVENT evt EXPORTING e1 = f1 e2 = f2

EVENT HADLER METHOD声明

METHODS meth FOR EVENT evt OF cif IMPORTING e1 e2

EVENT HANDLER METHOD 登录

SET handler H1 H2 [FOR]

访问权限区域:

PUBLIC SECTION:

在访问权限下定义项目则在所有类中可以访问,PUBLIC类的组件构成类与用户之间的口

PROTECTED SECTION:

在PROTECTED 访问权限下定义项目 只有自己和继承的里才能访问 属于私有关系

PRIVATE SECTION:

在PRIVATE访问权限下定义项目,只能显示在相同的类的方法中,在外部区域中无法访问,封装在内部类中, IMPLEMENTATION部分的所有方法在类中都可以访问,没有限制

输出结果:

使用继承关系:

实现结果:

对象:

每个对象都有自己固有的属性,类可以创建无限多个对象

参照对象:

  在ABAP中程序访问对象使用参照对象,参照对象被定义成指向对象的指针,在ABAP中,参照对象始终存在参照对象变量中。

参照对象的变量可以参照初始化已经存在的对象,指向对象参照变量清除对象的实体,类的实例可以利用指向对象的参照变量指定地址。利用参照对象变量的对象不能直接使用对象构造要素,需要利用Reference(对象地址)。在ABAP中已经存在类似结构体或者内表中使用的数据类型,已经定义了参照变量使用的数据类型,分别是Class Reference 和 Interface Reference 说明了类和变量直接的关系。

参照对象变量和其他的变量相同,可以用CLEAR语句初始化,参照对象变量的初始化值与对象参照数据类型无关。

创建对象:

案例:

CREATE OBJECT cref [TYPE class].

访问对象组件:

为了访问属性和方法,使用ref->attr 或者 CALL METHIOD ref->math 语句,

Ref->meth 语句是 CALL METHOD ref->meth 语句的缩写。

在类中可以创建多个实例:

可以通过MOVE语句为其他参照对象分配值,连接在同一个个体的参照物之间创建引用

案例:

对象go_obj2和go_obj1 都属于cls实例,两个对象都参照同一个类型的类,因此可以通过go_obj2 = go_obj1.

方法:

观察ABAP对象中构成的要素-方法(METHOD)的执行

声明方法时候可以利用

IMPORTING    输入

EXPORTING    输出

CHANGING     改变

RETURNING    返回

分别定义接口

实现方法

在类中声明方法需要IMPLEMENTATION部分实现其功能

METHOD meth

....

ENDMETHOD

调用方法

使用CALL METHOD meth  IMPORTING    输入

EXPORTING    输出

CHANGING     改变

RETURNING    返回

在方法内调用其他方法时候使用CALL METHOD meth 这样的语句即可,在类的外部调用方法时候CALL METHOD ref->meth 的语句,ref包含了指向类的值的接口参照对象变量,调用方法时候必须定义类似的EXPORTING  CHANGING 语句,但是IMPORTING或者RECEIVING以及处理错误的EXCEPTIONS语句是可选项 必要时候使用即可 调用只带一个IMPORTING参数方法时候使用下面语句。

CALL METHOD METHOD( f ).

带多个IMPORTING参数的方法使用下面语句

CALL METHOD METHOD (i1 = f1 i2 = f2).

调用动态的方法:

CALL METHOD ref->(f)

调用Static方法如下

CALL METHOD class =>(f)

CALL METHOD(C)=>meth

CALL METHOD(c) = (f).

与FUNCTION MODULE不同, PERFORM语句可以追加PARAMETER-TABLE 语句动态锁定参数

CALL METHOD ... PARAMETER-TABLE ptab

EXCEPTION-TABLE etab.

利用动态() 符号调用方法 调用方法部分CALL METHOD gv_oref->(gv_meth) 和 CALL METHOD go_oref->get_oref->get_data 执行相同的功能 动态属性分配也和调用方法一样:

实现结果:

事件处理方法

Methods ... for event evt OF cif.

构造函数:

构造函数是无法用CALL METHOD 调用的特殊函数 然后 指定类或者对象的初始化时,在Runtime 环境下会被自动系统调用 该函数两种类型 分别为实例构造函数和静态构造函数。

需要METHODS或者CLASS-METHODS部分追加下语句。

实例构造函数和静态构造函数,实例构造函数通过CREATE OBJECT语句,每次创建接口时候都调用;静态构造函数只有一开始调用时候被调用一次

METHODS constructor

IMPORTING[VALUE() il i2...[] ] TYPE type [OPTIONAL] ...

EXCEPTIONS exc1  exc2 ...

从以上语句看到,构造函数函数并没有OUTPUT参数,只要用来定义类的状态,类的实例构造函数已经定义好的方法构造函数,与其他方法一样,在PUBLIC 部分声明,在IMPLEMENTATION部分实现功能,静态构造函数当刚访问时的程序中调用一次,类的静态构造已经以CLASS_CONSTRUCTOR形式在内部定义,与其他方法一样,在PUBLIC部分以CLASS-METHODS CLASS_CONSTRUCTOR 形式声明,在IMPLEMENTATION部分可以实现功能.

CLASS-METHODS CLASS CONSTRUCTOR.

静态构造没有参数,因为还没有访问类之前,系统会先调用静态构造函数,因此静态构造函数无法访问自自己类中的项目。

继承

继承是使子类之间拥有共同属性以及方法的功能,一个类通过分析过程为更详细的精制的子类 此时子类会继承妇科类对的属性以及方法,使用继承的根本原因是用于类的重复使用

新创建的子类继承超级类中存在的所有组件

CLASS subclass DEFINTION INHERITNG FROM suprtclass

子类中不用附加声明属性和方法,但是子类可以访问超级类的PUBLIC PROTECTED 组件,子类中虽然存在超级类的PRIVATE的组件,但是也需要以相同的名字再次定义,从超级类的继承子类的方法可以访问类的PRIVATE属性

超级类若没有PEIVATE访问权限,则子类会成为父类的复制版,但是,在子类中可以追加新的组件,子类可以看做是超级类的分解体,不过子类只能拥有一个直属的超级类,这些情况中说明,并且这是单一的继承

重新定义的方法:

所有子类都有拥有超级类的构成方法但是无法修改,但是在方法中使用REDEFINITION语句会重新定义方法可以修改其功能,声明方法的部分和超级类的IMPLEMENTATION 部分不会影响子类重新定义方法的操作,子类中重新定义的方法会覆盖超级类的原有IMPLEMENTATION在子类中的功能。

METHODS meth REDEFINITION.

通过案例重新定义METHOD的方法和调用超级类原又method的方法.

Cl2是类Cl1的子类,类cl2中重新定义了超级类的CREATE方法,重新定义新的方法内,调用了超级类的CALL METHOD super->create 最后方法被重新定义后

抽象/最终方法的类:

ABSTACT 和 FINAL语句使用方法和类定义抽象,最终方法和类 抽象方法定义在抽象类中,ZI在类中无法实现功能,不过可以在子类中实现,抽象类无法初始化创建,Abstract类不能用初始化创建

Final方法在子类中的重要定义,也不能包含子类,即这两个类只能使用静态组件,

类的构成要素的命名空间

超级类的组件中只显示PUBLIC和PROTECTED 属性

重新定义方法时候将相同名字的方法重新IMPLEMENTATION覆盖了超级类的方法,但是重新定义的方法无法替代原有的方法IMPLEMENTATION 这就是原超级类的方法名字已经唯一的名字保留

调用超级类的方法要使用super->语句 这种符号为Pseudo Referece,

CALL METHOD super->method.

继承与静态属性:

与类的所有构成要素一样,静态属性在各个继承上只存一个,子类可以访问超级类的PUBLIC和PROTECTED 静态属性,相反 超级类可以和子类共享自己的PUBLIC和PROTECTED属性

用Static 定义属性的方法,即是不创建对象也可以利用静态符号 ”=>”访问类的修改其属性,另外子类中可以使用超级类继承静态属性和方法

实现方法:

继承和构造函数:

 在继承中有几项可以控制构造函数特殊规则,

实例构造函数:

所有拥有实例构造函数,调用创建对象构造函数时使用,前面提到,在继承树上的组件名字必须唯一,而构造函数却是例外事项。

METHODS CONTRUCTOR [FINAL]

[IMPORTING (parameter) ]

[ (RAISING |EXCEPTIONS ) (exci) ] MOVE f1+2(3)  TO f2

实例构造函数的概念:

静态构造函数:

所有类的包含了class_constructor静态构造函数,此方法在系统中已存在了,并且使用类的方法之前被调用,另外也没有参数,在程序中已经指定好子类的地址 则静态构造函数已经被执行状态,但是执行子类静态构造函数之前必须执行所有超级类的静态构造函数, 在此函数在程序中只能调用一次,

CLASS-METHODS class COnstrustor

上面语句只能在类声明PUBLIC 部分使用. 所有类包含了已经声明的自身 class_constructor 方法,但是使用上面语句可以追加所需功能,若是没有功能追加静态构造函数中,则不比声明此语句,与其他静态方法一样,静态构造函数也可以访问类的静态组件

接口:

接口的介绍ABAP语言不支持多重继承,这是因为多重继承方法调用以及类的结构层变的复杂, 因此, ABAP用的接口实现从完全没有的关系的类中访问其他的类,类的对象以及用参照变量对个体的访问组成的ABAP object的基本概念,下面是接口通过客户 订单 订单明细的关系创建的典型的业务应用软件.

     INTERFACR

         余额

     计算余额

CLASS1           CLASS2

金额                 金额       

存款                 特款

1.比较类和抽象类

一般类可以通过初始化创建(CREATE OBJECT) 但是抽象类不可以,只能从子类继承使用,因为抽象类没有实现功能的IMPLEMENTATION部分,抽象类是将一些共通的功能集合在一个类中,然后继承此类的子类中使用.

2. 比较类和接口

接口如是抽象类,不能直接通过初始化使用,然而可以追加到类中实现IMPLEMENTATION,类要实现接口的功能,只能通过接口实现.

3. 比较抽象类与接口

抽象类在子类继承以后才能实现自己具有的方法功能,而ABAP对象中只能实现单一继承,因此继承抽象类的子类不能再继续下去,但是接口不属于继承,在类中追加声明的概念,因此可以多重继承,下面是声明继承抽象类的子类中追加接口的情况,

CLASS c1 INHERITITING FROM 抽象类

INTERFACES 接口

ENDCLASS MOVE F1 + 2(3) TO F2.

定义接口:

接口如何类在ABAP程序中也可以定义全局,或者局部接口,定义可分为包含属性,方法,事件所有项目. 接口组件不必定义在访问权限领域中,因为在类中追加接口必须定义在PUBLIC SECTION中 , 另外在类中实现接口的方法,因此接口不能包含功能实现部分.

INTERFACE intf.

METHODS meth.

ENDINTERFACE.MOVE f1+2(3) TO F2.

实现接口:

接口不同于类,其实没有实例, 只是定义类中,并且在IMPLRMENTATION 中实现接口的方法

CLASS class DEFINTION.

INTRFACES inft

ENDCLASS

CLASS class IMPLEMENTATION.

METHOD inft~meth

ENDMETHOD.

ENDCLASS.

在类中接口只能定义在PUBLIC SECTION 中,因此实现接口的功能时候,接口的组件会追加到PUBLIC SECTION 中 上句接口intf 组件 meth 定义在类的IMPLEMENTATION中 ,则类中会存在inft~meth

接口的方法可以在类中实现,即接口可以在其他的类中实现。

 参照接口:

参照变量可以访问对象,不用创建类的参照变量,只需要参照接口的参照变量就可以直接访问对象,即是类中已经实现了接口inft 则只用参照接口的参照变量就可以访问组件,意味着不比创建类的参照变量

DATA: iref TYPE REF OF inft.

接口通过Reference 可以使用多个拥有统一的形态 这称作为多态

实现结果:

事件:

在ABAP对象中在没有继承关系类之间,从一个类的方法调用另一个类的方法时候需要事件来控制,在类中定义事件时类的方法可以触发事件,在与Event Handler 交替启动

触发事件:

为了触发事件,类必须在声明部分定义事件,使其在方法中触发事件,

声明事件:

在类或者接口中的声明部分首先声明事件,用以下语句声明实例事件,静态事件使用CLASS-EVENT语句.

实例事件:

用EVENSTS语句可以声明实例事件,只有实例方法才能调用Event

EVENTS evt EXPORTING ... VALUES(e1 e2).

TYPE type [OPTIONAL]...

静态事件:

 可利用CLASS-EVENTS语句声明静态事件,所有方法都能调用静态事件,静态事件是在静态方法中可以调用的唯一事件

CLASS-EVENTS evt...

Trggering Event:

类的内部实例事件在类的所有实例中都可以触发,静态事件在所有方法中都可以触发,但是只有静态方法才能触发静态事件.

Handling EVENT

触发事件的前提是方法必须声明为Handler方法,并且执行前要注册事件

声明事件处理器的方法

所有类都拥有其他类的触发自身类的可以调用的事件处理器的方法,当然,可以在同一个类中事件和事件处理器定义方法

METHODS meth FOR EVENT evt OF cif IMPORTING e1 e2.

Static 方法可以使用CLASS-METHODS语句定义

SET HANDLER h1 h2 ... [FOR]...

指定注册实例事件处理器的对象领域使用FOR语句 用FOR ALL INSTANCES 语句一次性注册触发事件的所有实例处理器.

SET HANDLER h1 h2 FOR ref

SET HANDLER h1 h2 FOR ALL INSTANCES.MOVE f1+f2(3) TO f2.

静态事件中无法使用FOR语句.

SET HANDLER h1 h2.

类生成器:

在程序代码中创建的类只能在程序中使用,因此属于局部类,还有可以利用类生成器 T-CODE:SE24 创建类的接口,使用该方法生成接口注册到ABAP数据字典的全局对象中,因此所有程序都可以使用.

集成:

类生成器帮助创建了WEB开发中使用的对象,通过类生成器可以维护类库中的存在的所有对象, 说明了类生成器的结构和组件之间的关系,利用T-CODE:SE24的菜单执行类生成器,若创建对象类型,则实现方法功能,在类生成器初画面上可以执行测试环境。

利用类生成器创建类的步骤:

下面利用类生成器T-CODE:SE24 创建执行相同的类:

创建类的类型选择类:

指定类的属性,输入类的描述:

性能:显示类的基本属性:

属性,关于类的属性前面已经介绍了,LEVEL定义实例 静态 常量 而Visibility定义类的访问权限

方法输入类的方法LEVEL和Visibility项目一般设置为INSTANCE和 PRIVATE这次将Visibility改成PUBLIC:

事件追加事件TYPE选择Instance Event Visibility选择PUBLIC.

实现方法, 实现方法代码参考

在类中创建内表:

第一种是PUBLIC领域 第二种是PRIVATE领域:

创建内表在T-CODE:SE11创建表类型ZTBTYPE

选择Table type 后的LINE TYPE中输入SFLIGHT

在标签上的TYPE中输入ZTBTYPE即可成内表

利用生成器测试类:

通过类生成器T-CODE:SE24可以直接测试创建类:

在T-CODE:SE83(存储库信息系统) 可以找到相应方法的类

上一篇 下一篇

猜你喜欢

热点阅读