ABAP 面向对象程序设计 (03)- 对象的创建

本篇博文介绍在 ABAP 中创建对象的一些知识点。

无构造方法

定义一个类,如果不需要创建的时候传入参数来实例化,可以不用显式定义构造方法。假设要定义 lcl_vehicle 类,包括下面代码所示的方法和属性:

以下是 lcl_vehicle 的实现:

我们接下来创建两个对象的实例 (instance of object):


对象实例化过程,实际上包括对象的创建引用变量的定义,引用变量指向实例化的对象。上面的代码在内存中大致是这样的关系:

create object 语句,先根据 class 模板创建一个对象实例,然后再创建一个引用类型的变量保存对象的内存地址。如果没有创建对象的实例,直接通过引用变量来调用对象的方法将出现下面的错误。比如,在上面的程序中,去掉 create object vehicle2. 这一行,运行直接 dump,提示下面的错误:

 Access via 'NULL' object reference not possible.

为了避免程序运行时 null reference 错误,可以对对象变量进行判断:

对象变量的赋值

对象变量的赋值的结果是两个引用变量指向同一个对象的实例,比如下面的代码:


使用 create object 创建了 vehicle1,通过 accelerate 方法,第一次显示速度的时候为 35,然后将 vehicle1 赋值给 vehicle2,再对 vehicle1 加速 5,结果 vehicle1 和 vehicle2 的速度都为 40。原因就是 vehicle1 和 vehicle2 指向同一个对象的实例

使用构造方法

ABAP 的构造方法的名称始终为 constructor,定义 constructor 的时候,只能有 importing 参数,无 exporting 参数和 returning 参数。构造方法主要的作用之一就是对 对 attributes进行初始化。假设我们需要在定义 vehicle 对象实例的时候,指定其 brand。将类的代码改写如下:


定义了构造方法的类,在创建对象实例的时候必须指定 exporting 参数。

创建多个对象

ABAP 没有数组,根据某一个类创建多个对象实例的时候,可以将对象变量存放在内表中,使用起来比较方便,以下代码演示了使用的方法 (代码 z_oop_003_5)。

控制对象的创建

一般情况下,对于定义的类,都可以通过 create object 语句创建对象的实例,如果需要控制对象实例的创建,比如只允许有一个对象实例能被创建,也就是所谓的单例模式,则要通过定义专门的方法来创建对象实例,同时不允许外部直接创建对象的实例。以下代码演示了单例模式的使用要点和方法。

要点:

  • 通过 create private 关键字,不允许外部通过 create object 语句创建对象
  • 在类中定义一个静态属性,指向该类的实例
  • 定义一个静态方法 (get_instance),只有在对象实例不存在的时候才创建

首先给出完整代码 (z_oop_003_6):

lcl_vehicle 的 definition 部分 有 create private 关键字,这个类不允许外部使用 create object 创建对象实例。静态属性 vehicle_obj 指向类本身,在静态方法 get_instance 中,如果 vehicle_obj 没有指向合法的对象实例,则创建对象,否则不创建。

本篇博文的代码中,出现了 is initial 和 is bound 两种语法,简单来说:is bound 用于判断引用变量是指向合法的对象,is initial 判断 变量是否处于初始状态。

我们也可以通过另外一个类来控制对象的创建。比如为了创建 lcl_vehicle 对象,通过 lcl_vehicle_mgr (manager) 的静态方法 get_instance 来创建。因为涉及到两个类,为了避免程序创建对象时出错,需要在 lcl_vehicle 类定义的前面使用 definition deferred 关键字声明 lcl_vehicle_mgr 可能延后,并且在 lcl_vehicle 类的定义部分通过 friend 关键字指定 lcl_vehicle_mgr 为友元类。下面是完整代码 (z_oop_003_7)

源码

github - ABAP-OOP-003

猜你喜欢

转载自blog.csdn.net/stone0823/article/details/107589447