ABAP OO面向对象编程--定义、实现和使用类

- Define, implement and use simple class(定义、实现和使用简单类):指的是在编程中创建一个基本的类,实现其功能,并在程序中使用它。

     类是对象的模板。反过来说,也可以说对象的类型就是它的类。类是对对象的抽象描述,可以将其视为构建对象的一组指令。对象的属性由类的成分定义,这些成分描述了对象的状态和行为。

本地类和全局类 :在ABAP对象中,类可以被声明为全局的或局部的。在ABAP工作台的类构建器(事务SE24)中定义全局类和接口。它们被集中存储在R/3存储库的类库中的类池中。R/3系统中的所有ABAP程序都可以访问全局类。局部类是在ABAP程序内部定义的。局部类和接口只能在定义它们的程序中使用。在ABAP程序中使用一个类时,系统首先会搜索具有指定名称的局部类。如果没有找到,它会寻找全局类。除了可见性问题之外,使用全局类和使用局部类没有区别。然而,在设计局部类和全局类的方式上存在显著差异。如果定义的局部类只在单个程序中使用,通常只需要定义外部可见的组件,以使其适应该程序。另一方面,全局类必须能够在任何地方使用。这意味着在定义全局类的接口时,必须遵守某些限制,因为系统必须能够保证任何使用全局类对象的程序都能识别每个接口参数的数据类型。

定义局部类:局部类由ABAP源代码组成,被ABAP语句CLASS ... ENDCLASS包围。一个完整的类定义包括声明部分和(如果需要的话)实现部分。类<class>的声明部分是一个语句块:

 

CLASS <class> DEFINITION.

...

ENDCLASS.

它包含了类的所有组件(属性、方法、事件)的声明。当定义局部类时,声明部分属于全局程序数据。因此,应该将其放在程序的开头。

类的结构 

以下陈述定义了类的结构:

  • 类包含组件

  • 每个组件被分配到一个可见性部分

  • 类实现方法

以下部分更详细地描述了类的结构。

类组件 

类组件构成了类的内容。所有组件都在类的声明部分声明。组件定义了类中对象的属性。当定义类时,每个组件都被分配到三个可见性部分之一,这些部分定义了类的外部接口。类的所有组件在类内部都是可见的。所有组件都在同一个命名空间中。这意味着类的所有组件必须在类内部具有唯一的名字。

类中有两种类型的组件——那些为每个对象单独存在的组件,以及那些不论实例数量如何,整个类只存在一次的组件。特定于实例的组件被称为实例组件。不特定于实例的组件称为静态组件。在ABAP对象中,类可以定义以下组件。由于可以在类中声明的所有组件也可以在接口中声明,以下描述同样适用于接口。

属性 

属性是类内部的数据字段,可以具有任何ABAP数据类型。对象的状态由其属性的内容决定。属性的一种类型是引用变量。引用变量允许你创建和引用对象。引用变量可以在类中定义,使你能够在类内部访问对象。

实例属性 

实例属性的内容定义了对象的特定实例状态。使用DATA语句来声明它们。

静态属性 

静态属性的内容定义了对类的所有实例都有效的类状态。静态属性对每个类只存在一次。使用CLASS-DATA语句来声明它们。它们在整个类的运行时都是可访问的。类中的所有对象都可以访问其静态属性。如果在一个对象中更改了静态属性,这个更改在类中的所有其他对象中都是可见的。

方法 

方法是类内部的程序,定义了对象的行为。它们可以访问类的所有属性。这使得它们能够改变对象的数据内容。它们还具有参数接口,用户在调用它们时可以向它们提供值,并从它们那里接收值。类的私有属性只能通过同一类中的方法来改变。

方法的定义和参数接口与函数模块类似。你在类的声明部分定义一个方法<meth>,并在实现部分使用以下处理块来实现它: 

METHOD <meth> .

     ...

ENDMETHOD.

可以像在其他ABAP程序(子程序和函数模块)中一样,在方法中声明局部数据类型和对象。使用CALL METHOD语句来调用方法。

实例方法 

使用METHODS语句声明实例方法。它们可以访问类的所有属性,并能触发类的所有事件。

静态方法 

使用CLASS-METHODS语句声明静态方法。它们只能访问静态属性并触发静态事件。

特殊方法 

除了使用CALL METHOD调用的正常方法外,还有两种特殊方法,分别称为CONSTRUCTOR和CLASS_CONSTRUCTOR,它们在创建一个对象(CONSTRUCTOR)或首次访问类的组件(CLASS_CONSTRUCTOR)时自动被调用。

可见性部分

可以将类的声明部分划分为最多三个可见性区域: 

CLASS <class> DEFINITION. 

PUBLIC SECTION. 

... 

PROTECTED SECTION.

... 

PRIVATE SECTION.

... 

ENDCLASS. 

这些区域定义了类组件的外部可见性,即类与其用户之间的接口。类的每个组件都必须被分配到一个可见性部分。

公共部分 

在公共部分声明的所有组件对类的所有用户以及继承自它的类的方法是可访问的。类的公共组件构成了类与其用户之间的接口。

受保护部分 

在受保护部分声明的所有组件对类及其子类的所有方法都是可访问的。受保护组件在类与其子类之间形成了一种特殊的接口。

私有部分 

在私有部分声明的组件仅在同一个类的方法中可见。私有组件不是类外部接口的一部分。

封装 

三个可见性区域是面向对象编程中的一个重要特性——封装的基础。当定义一个类时,应该非常小心地设计公共组件,并尽可能地声明最少的公共组件。一旦发布了一个类,全局类的公共组件就不能再被改变。

例如,公共属性是外部可见的,并且构成了对象与其用户之间的接口的一部分。如果想完全封装一个对象的状态,就不能声明任何公共属性。除了定义属性的可见性之外,还可以使用READ-ONLY修饰符来防止它被更改。

如果在类的声明部分声明了方法,还需要为它编写一个实现部分。这由另一个语句块组成:

 

CLASS <class> IMPLEMENTATION.
...
ENDCLASS.

类的实现部分包含了类所有方法的实现。局部类的实现部分是一个处理块。因此,不属于处理块的后续编码是不可使用的。

在实现方法时,不需要指定任何接口参数,因为这些已经在方法声明中定义了。方法的接口参数在方法实现中表现得像局部变量。可以使用DATA语句在方法内部定义额外的局部变量。

与函数模块一样,可以使用RAISE <exception>和MESSAGE RAISING语句来处理错误情况。

当实现一个静态方法时,请记住它只能操作类的静态属性。实例方法可以操作静态和实例属性。

      以下ABAP代码定义了一个名为`lcl_airplane`的类,用于表示飞机。下面是对代码的逐行注释说明:


***INCLUDE ZBC404_HF_LCL_AIRPLANE1 .
******************************************
* Definition part
* 定义部分
******************************************
CLASS lcl_airplane DEFINITION.和使用类
* 定义一个名为lcl_airplane的类。

*--------------------------------
* Public section
* 公共部分
*--------------------------------
  PUBLIC SECTION.
* 公共部分声明,这些成员可以被其他类访问。
    TYPES: t_name(25) TYPE c.
   * 定义一个类型t_name,用于存储长度为25个字符的字符串。

    METHODS:
      constructor,
      set_attributes IMPORTING p_name       TYPE t_name
                               p_planetype  TYPE saplane-planetype,
      display_attributes,
      display_n_o_airplanes.
   * 定义方法:构造方法(constructor),用于创建类的实例时初始化属性。
   * set_attributes方法,用于设置飞机的名称和类型。
   * display_attributes方法,用于显示飞机的属性。
   * display_n_o_airplanes方法,用于显示创建的飞机实例总数。

*--------------------------------
* Private section
* 私有部分
*--------------------------------
  PRIVATE SECTION.
* 私有部分声明,这些成员只能被类的其他方法访问。
*   Private attributes
    DATA: name(25) TYPE c,
          planetype TYPE saplane-planetype.
   * 声明私有属性name和planetype,分别用于存储飞机名称和类型。
*   Private static attribute
    CLASS-DATA n_o_airplanes TYPE i.
   * 声明一个类数据成员n_o_airplanes,用于跟踪创建的飞机实例总数。

ENDCLASS.

******************************************
* Implementation part
* 实现部分
******************************************
CLASS lcl_airplane IMPLEMENTATION.
* 实现部分,定义类的方法的具体行为。

  METHOD constructor.
    * 构造方法的实现,用于初始化飞机的名称和类型。
    n_o_airplanes = n_o_airplanes + 1.
    * 每次创建新实例时,增加飞机实例的总数。
  ENDMETHOD.

  METHOD set_attributes.
    * set_attributes方法的实现,用于设置飞机的名称和类型。
    name      = p_name.
    planetype = p_planetype.
  ENDMETHOD.

  METHOD display_attributes.
    * display_attributes方法的实现,用于显示飞机的名称和类型。
    WRITE:/ 'Name:', name, 'Planetype:', planetype.
  ENDMETHOD.

  METHOD display_n_o_airplanes.
    * display_n_o_airplanes方法的实现,用于显示创建的飞机实例总数。
    WRITE: / 'No. planes:', n_o_airplanes.
  ENDMETHOD.

ENDCLASS."
* 实现部分结束。

    这个类定义了一个飞机对象,包括它的属性(名称和类型)和一个类数据成员(飞机实例总数)。类中的方法允许创建飞机实例、设置其属性、显示其属性以及显示所有创建的飞机实例总数。构造方法在创建新实例时自动调用,而set_attributes方法提供了一种在创建后设置属性的方式。

       以下ABAP代码是一个报表程序(REPORT),用于创建和操作lcl_airplane类的对象。以下是对代码的逐行注释说明:

REPORT ZBC404_HF_MAINTAIN_AIRPLANES.
* 报告的名称是ZBC404_HF_MAINTAIN_AIRPLANES。

INCLUDE zbc404_hf_lcl_airplane1.
* 包含名为zbc404_hf_lcl_airplane1的本地对象文件,
* 这个文件包含了lcl_airplane类的实现。

* Create reference to class lcl_airplane
* 创建对lcl_airplane类对象的引用。
DATA: airplane1 TYPE REF TO lcl_airplane,
      airplane2 TYPE REF TO lcl_airplane.

START-OF-SELECTION.
* 报告的开始部分。

* Create instance
* 创建lcl_airplane类的实例。
  CREATE OBJECT airplane1.
* 调用静态方法display_n_o_airplanes来显示当前创建的飞机实例总数。
  CALL METHOD: airplane1->display_n_o_airplanes.

* 创建第二个飞机实例。
  CREATE OBJECT airplane2.

* Setting attributes using a method with parameters
* 使用带参数的方法set_attributes来设置飞机的属性。
  CALL METHOD airplane1->set_attributes 
            EXPORTING p_name      = 'Kurt'
                      p_planetype = 'MD80'.

END-OF-SELECTION.
* 报告的结束部分。

* Using methods
* 使用飞机对象的方法。
  CALL METHOD: airplane1->display_n_o_airplanes, " 显示飞机实例总数
               airplane1->display_attributes.  " 显示飞机的名称和类型

   这段代码首先包含了lcl_airplane类的实现,然后创建了两个飞机对象的引用。接着,它创建了第一个飞机实例并显示了当前的飞机实例总数。然后,它创建了第二个飞机实例,并使用set_attributes方法(这个在原始的lcl_airplane类定义中没有提供,是在zbc404_hf_lcl_airplane1中定义的)来设置第一个飞机实例的名称和类型。最后,它再次显示了飞机实例总数和第一个飞机实例的属性。

程序执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ᝰ随心ꦿེএ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值