Skip to content
关注公众号,可咨询工作中遇到的问题、获取学习资料、掌握行业资讯

ABAP 对象

一、介绍

  [在前章已提到过,对象(Obiect)指的是类的实例。每个对象都有自己固有的属性。类可以创建无限多的对象。
  [[图14-8]左图显示类C1的构成项目和方法信息。另外,右说明了ABAP程序内部会话(IntermalSession,参照11章图11-1)中存在类的实例-对象。
alt text

二、参照对象

  在ABAP程序中要访问对象需要使用参照对象(ObjectReference)。参照对象被定义成指向对象的指针。在ABAP中,参照对象始终存在于参照对象变量中。
  ABAP中存在包含Reference两种类型的变量。分别是参照对象变量与参照数据变量(Data Reference Variabe)。数据参照变量在“第10章 Field Symbol&DataReference”中学习,和参照对象变量概念基本相同。
  参照对象变量包含参照对象的Reference(对象地址),利用下面的语句生成。

abap
DATA crefTYPE REF TO class

  参照对象变量可以参照或初始化已经存在的对象。指向对象的参照变量清楚对象的实体,类的实例可以利用指向对象的参照变量指定地址。利用参照对象变量的对象不能直接使用对象的构成要素,需利用Reference(对象地址)。ABAP中已经存在类似于结构体或者内表中使用的数据类型,也已经定义了参照变量中使用的数据类型。分别是CIassReference和Interface Reference。「图14-9]说明了类和参照对象变量之间的关系。 alt text   参照对象变量与其他变量相同,可以用CLEAR语初始化。参照对象变量的初始值与对象所参照的数据类型无关。

三、创建对象

  在 14.3.1节中创建了参照类的参照对象变量'cref。利用此参照变量创建类的实例-对象。若参照对象变量在程序声明部分已经参照了对象,创建实例即对象时不用重复使用TYPE语句。比较例外的是,当已经创建了如DATA:Iref TEYPREFTO OBJECT.语句的参照最上层类OBJECT的参照变量1ref,创建实例时需定义如CREATEOBJECTIrefTYPE class的语句。

abap
CREATE OBJECT cref「TYPE classl.

四、访问对象组件

  为了访问对象的属性和方法,使用ref->attr或者CALLMETHODref>meth 语句。ref->meth 语句是 CALLMETHODref->meth .语句的缩写(Release 4.6 版本之后开始识别这种缩写)。
  还有创建对象前也可访问类的Static组件。为了访问Static属性,使用class=>attr 语句,Static 方法则利用CALLMETHODclass=>meth 语句。 alt text

五、在类中创建多个实例

  前面已经提到,可利用CREATEOBJECT语句创建新对象。在程序内根据一个类可以创建多个对象,这些对象都完全独立且具有各自的名字和属性。

1.分配参照对象

  可以通过 MOVE 语句为其他参照对象分配值。连接在同一个个体的参照变量之间可以创建引用。使用MOVE语句或分配符号“=”时系统会自动检查是否为可以分配的类型。 alt text   若使用以上语句,两个类的类型要一致。意味着要参照同一个类。在[例14-7]中,首先参照 cls 类创建了一个对象 go_obj1。然后没有用 CREATEOBJECT 语句创建 go_obj2 对象用go_obj2=go_obj1 语句创建了 go_obj2 对象。 [例14-7]

abap
REPORT z14_07.
* Class Declarations
CLASS cIs DEFINITION INHERITING FROM object,
   PUBLIC SECTION.
      METHODS: create.
ENDCLASS.

*Class IMPLEMENTATIONS
CLASS cls IMPLEMENTATION
   METHOD create.
      WRITE: / 'Object is created'
   ENDMETHOD.
ENDCLASS.

*GlobaI DATA
DATA : go_objl TYPE REF TO cls,
      go_obj2 TYPE REF TO cls.

*Classical Processing Blocks
START-OF-SELECTION.
   CREATE OBJECT: go_obj1.
   go_obj2=go_obj1.
   CALL METHOD: go_obj2->create.

[结果14-7]

abap
Object is created

  在[例 14-7]中,对象 go_obj2 和 go_obj1 都属于类 cls 的实例,即这两个对象参照了同一类型的类,因此可通过 go_obj2=go_obj1 语句创建对象。
  下面分别创建 vehicle和 plane 类,介绍如何分配不同类对象之间的值。

2.CASTING

  可以利用 casting 符号“?”参照从其他类衍生的对象创建新对象。此时,其他类指的是父类和从父类继承的子类。子类可重新定义,或追加父类的属性及方法。从父类衍生的对象和子类衍生的对象类型可能不同,但此时可用casting符号“?”正常执行程序。 [例14-8]

abap
RREPORT z14_08.

CLASS vehicle DEFINITION INHERITING FROM object.
   PUBLIC SECTION.
      METHODS: create,
            drive.
   PROTECTED SECTION.
      DATA speed TYPE i VALUE '100'.
ENDCLASS.      "vehicle DEFINITION

CLASS plane DEFINITION INHERITING FROM vehicle.
      PUBLIC SECTION.
   METHODS: fly.
ENDCLASS.      "plane DEFINITION

*Class IMPLEMENTATION
CLASS vehicle IMPLEMENTATION.
   METHOD create.

   ENDMETHOD.     "vehicle
   METHOD drive.
      specd=speed + 100.
      WRITE : "Driving is possible, ', 'Current Speed:', speed.
   ENDMETHOD.
ENDCLASS.

"vehicle IMPLEMENTATION
"vehicle
CLASS plane IMPLEMENTATION.
METHOD fy.
speed= speed + 1000.
ENDMETHOD.
ENDCLASS.

"plane IMPLEMENTATION
DATA : car TYPE REF TO vehicle,
      air TYPE REF TO vehicle.

START-OF-SELECTION.
   CREATE OBJECT: car.
   air ?= car.
    
CALL METHOD: air->drive
*CALL METHOD: air->fly.

[结果14-8]

abap
Driving is possible, Current Speed:  200

  在[例 14-8]中,plane 类中存在方法 fy,但在'air?=car.语句中被casting成car,因此无法再使用 y 方法。解除相应行注释后激活程序,则CALL METHOD: air->hy.语句中会发生如[图 14-10]所示的错误。 alt text   不能再使用 fly方法。即plane类只能在父类create 方法中使用。