当前位置: 代码迷 >> 综合 >> ABAP 类、接口、事件
  详细解决方案

ABAP 类、接口、事件

热度:60   发布时间:2024-02-01 13:57:05.0

基类:(父类)被继承,继承基类的类被称为派生类。ABAP所有的类都是默认继承了空类object.具有一般性的类称为基类(superclass),其各个子类被称为派生类(subclass)。

一个类只可以有一个基类(父类),但是可以有多个派生类(被多次继承)。

多态:子类继承父类可以使用父类的方法,也可以重载父类的方法(此方法需为实例方法)。但是如果需要使用父类(基类)的方法,则需要使用关键词SUPER,两个派生类使用父类的参数和方法是并不相互影响。

Receiving 的使用

  CALL METHOD ob_circle->get_area
EXPORTING
      i_radius = radius
RECEIVING
r_size   
= area.
  area = ob_circle->get_area( radius ).

 

抽象类和抽象方法:因为基类是作为模版出现的,所以不需要实例化,我们可以基类声明为抽象类,抽象类不能使用create object语句创建类对象,实际使用的对象则依照各个派生类创建,也可以把方法定义为抽象方法。

一个抽象方法是不能在类本身中实现,而必须在其派生出来的非抽象类中实现,因而含有抽象方法的类必须定义为抽象类。

抽象类不可以实例化,但是可以使用type ref to 引用,然后接受子类的实例化

Create object lo_a type

 

最终类和最终方法:

最终类(final class),是不能被继承的类。其主要意义在于:在设计的过程中,如果一个类有很多的派生类,则其公有和被保护成员方法,随意改动类,很容易造成派生类中语法和主义的冲突,因而如果不希望在程序中继续对该类进行派生,则可以定义该类为最终类。

最终方法是不可以重新定义的方法,不一定出现在最终类中,但是最终类中的所有方法都是最终方法。

 

接口:

1)、接口的定义和实现

   Interface是可以让这些类外部看起来具有一致性,标准化的接口,又可以在不通过的类内部使用骨痛的实现方法,而这个具体实现过程是用户是类外部用户无需关心的。

   接口是一个独立的结构,可以在其中定义一些成员在具体类中实现,其作用是类中已经定义的成员进行扩展,实现接口后,接口将成为类的公有成员,但类可以自行对接口的方法以其自身特定形式实现。对用户来说,不同的类对象可以包含相同的操作接口,但是程序内部的具体实现则根据类的不同而有所区别,接口是OOP中除了继承之外另一个主导多态性的实现机制技术。

类中的成员可以与类中的相同,而且无需著名可见性,因为具体类实现的接口组件均为公有成员。接口只包含成员的声明部分,具体的实现也是在具体类中的。

 

2)、接口的引用:

子类是可以使用父类的接口的。对于包含接口的类对象,除了通过类引用访问之外,还可以通过接口引用进行访问,接口引用可以指向任何实现了该接口的对象。

Data iref type ref to intf.

Intf 是全局或程序中已经定义的接口。

如果要访问一个接口,需要定义一个接口变量,此接口引用与类引用指向相同的类对象。假设接口变量名称inef,类引用的名称为cref,赋值语法格式如下:

Iref = cref。

 

使用类引用访问: cref->intf~attr。

Call method cref->intf~meth.

 

使用接口应用访问属性和方法的语法格式如下:

Iref->attr               call method iref->meth

 

对于接口中定义的静态成员,如果市场量,则只能通过接口引用访问。

Intf=>const

 

对于其他静态接口成员,则可以通过实现该接口的类本身或者类引用进行访问:

Class=>intf~attr.

Call method class=>intf~meth.

 

在接口引用中赋值,与类引用相似,可以将接口引用分配给不同的引用变量,还可以在类引用以及接口引用之间相互赋值。

 

事件:

事件是对一个类对象发布其状态的改变,因而其他对象可以捕获该方法并做出响应。

1)、声明事件:

事件可以在类或接口的声明部分进行声明。声明时间的时候可以通过exporting附加项指定向事件处理方法中传递的参数,该参数传递方法何为值传递,实例事件总归是包含一个隐含的参数SENDER,该参数的类型为触发事件的类或接口的对象引用。

EVENT | CLASS-EVENTS evt EXPORTING … VALUE(e1) TYPE type [optional]

 

2)、触发事件:

一个实例事件可以被类中的任意方法出发,静态事件则可以被静态方法触发。

Raise event evt exporting … ei = f1…

对于每一个没有被指定optional项的形参ei,均必须在实力方法中传递一个实参fi,自身引用me对象在被默认的传递到隐含参数sender。

 

3)、事件处理方法

事件需要通过方法捕获事件并进行处理,必须首先为该事件定义一个事件处理方法,然后在运行时为该事件进行注册。

声明事件处理方法

任何类都可以为其他类中定义的事件进行处理,同事也可以为自身事件进行处理。

 

4)、注册事件处理方法

要使事件处理方法能够对事件进行响应,必须在运行时为相关事件注册该方法,语法格式为:

SET HANDLE …… hi…[ for ]………

该语句将处理方法与相关的触发方法进行链接,其语法和使用效果部分地取决事件的类型:

  1. 定义在类中的实例事件
  2. 定义在接口中的实例事件
  3. 定义在类中的静态事件
  4. 定义在接口中的静态事件

 

对于实例事件,在进行处理之前必须在注册语句中使用附加项FOR指定希望注册到的对象,可以指定一个单独的对象作为事件触发者。

Set handle       for  ref.

或者使用for all instances附加项为处理器注册所有可以触发该事件的实例。

Set handle        for all instances.

该注册过程可以作用于目前尚未被创建的实例,

对于静态事件,则不能使用 for附加项:

Set handle   

该注册自动应用与整个类,对于接口中的静态事件,该注册可以应用与目前尚未装载值内在中的类。

 

5)、事件处理时间

当程序执行到raise event语句之后,所有已注册的处理方法都将在下一个语句之前被处理,如果处理方法本身触发事件,则该处理方法再原方法继续执行前被重新调用。