
ABAP 对象
一、介绍
[在前章已提到过,对象(Obiect)指的是类的实例。每个对象都有自己固有的属性。类可以创建无限多的对象。
[[图14-8]左图显示类C1的构成项目和方法信息。另外,右说明了ABAP程序内部会话(IntermalSession,参照11章图11-1)中存在类的实例-对象。
二、参照对象
在ABAP程序中要访问对象需要使用参照对象(ObjectReference)。参照对象被定义成指向对象的指针。在ABAP中,参照对象始终存在于参照对象变量中。
ABAP中存在包含Reference两种类型的变量。分别是参照对象变量与参照数据变量(Data Reference Variabe
)。数据参照变量在“第10章 Field Symbol&DataReference
”中学习,和参照对象变量概念基本相同。
参照对象变量包含参照对象的Reference(对象地址),利用下面的语句生成。
DATA crefTYPE REF TO class
参照对象变量可以参照或初始化已经存在的对象。指向对象的参照变量清楚对象的实体,类的实例可以利用指向对象的参照变量指定地址。利用参照对象变量的对象不能直接使用对象的构成要素,需利用Reference(对象地址)。ABAP中已经存在类似于结构体或者内表中使用的数据类型,也已经定义了参照变量中使用的数据类型。分别是CIassReference和Interface Reference。「图14-9]说明了类和参照对象变量之间的关系。 参照对象变量与其他变量相同,可以用CLEAR语初始化。参照对象变量的初始值与对象所参照的数据类型无关。
三、创建对象
在 14.3.1节中创建了参照类的参照对象变量'cref。利用此参照变量创建类的实例-对象。若参照对象变量在程序声明部分已经参照了对象,创建实例即对象时不用重复使用TYPE语句。比较例外的是,当已经创建了如DATA:Iref TEYPREFTO OBJECT.语句的参照最上层类OBJECT的参照变量1ref,创建实例时需定义如CREATEOBJECTIrefTYPE class的语句。
CREATE OBJECT cref「TYPE classl.
四、访问对象组件
为了访问对象的属性和方法,使用ref->attr或者CALLMETHODref>meth 语句。ref->meth 语句是 CALLMETHODref->meth .语句的缩写(Release 4.6 版本之后开始识别这种缩写)。
还有创建对象前也可访问类的Static组件。为了访问Static属性,使用class=>attr 语句,Static 方法则利用CALLMETHODclass=>meth 语句。
五、在类中创建多个实例
前面已经提到,可利用CREATEOBJECT语句创建新对象。在程序内根据一个类可以创建多个对象,这些对象都完全独立且具有各自的名字和属性。
1.分配参照对象
可以通过 MOVE 语句为其他参照对象分配值。连接在同一个个体的参照变量之间可以创建引用。使用MOVE语句或分配符号“=”时系统会自动检查是否为可以分配的类型。 若使用以上语句,两个类的类型要一致。意味着要参照同一个类。在[例14-7]中,首先参照 cls 类创建了一个对象 go_obj1。然后没有用 CREATEOBJECT 语句创建 go_obj2 对象用go_obj2=go_obj1 语句创建了 go_obj2 对象。 [例14-7]
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]
Object is created
在[例 14-7]中,对象 go_obj2 和 go_obj1 都属于类 cls 的实例,即这两个对象参照了同一类型的类,因此可通过 go_obj2=go_obj1 语句创建对象。
下面分别创建 vehicle和 plane 类,介绍如何分配不同类对象之间的值。
2.CASTING
可以利用 casting 符号“?”参照从其他类衍生的对象创建新对象。此时,其他类指的是父类和从父类继承的子类。子类可重新定义,或追加父类的属性及方法。从父类衍生的对象和子类衍生的对象类型可能不同,但此时可用casting符号“?”正常执行程序。 [例14-8]
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]
Driving is possible, Current Speed: 200
在[例 14-8]中,plane 类中存在方法 fy,但在'air?=car.语句中被casting成car,因此无法再使用 y 方法。解除相应行注释后激活程序,则CALL METHOD: air->hy.语句中会发生如[图 14-10]所示的错误。 不能再使用 fly方法。即plane类只能在父类create 方法中使用。