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

news2024/12/24 20:24:57

- 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中定义的)来设置第一个飞机实例的名称和类型。最后,它再次显示了飞机实例总数和第一个飞机实例的属性。

程序执行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1889952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聊一聊领域驱动和贫血

写在前面 前段时间跟领导讨论技术债概念时不可避免地提到了代码的质量&#xff0c;而影响代码质量的因素向来都不是单一的&#xff0c;诸如项目因素、管理因素、技术选型、人员素质等等&#xff0c;因为是技术债务&#xff0c;自然就从技术角度来分析&#xff0c;单纯从技术角…

秋招Java后端开发冲刺——非关系型数据库篇(MongoDB)

MongoDB 本文介绍非关系型数据库MongoDB的基础知识和常见面试题。 &#xff08;一&#xff09;基础知识 1. 介绍&#xff1a;MongoDB是一个基于分布式文件存储的数据库&#xff0c;由C语言编写&#xff0c;旨在为WEB应用提供可扩展的高性能数据存储解决方案。 2.特点 特点…

数次同台,极越与小米的爱恨情仇

在汽车行业&#xff0c;提起小米&#xff0c;或许很多人都会记得在北京车展登台亮相的小米su7。可提到极越&#xff0c;或许更多人会为之一愣——这是个什么汽车品牌&#xff1f; 实际上&#xff0c;在今年四月的北京车展中&#xff0c;它就坐落于小米汽车W2展馆正对面。这也可…

Electron、Win11静默打印与PowerShell:技术融合与应用探索

Electron、Win11静默打印与PowerShell&#xff1a;技术融合与应用探索 在现代软件开发与办公环境中&#xff0c;技术的融合与创新不断推动着工作效率的提升和用户体验的优化。本文将深入探讨Electron框架、Windows 11&#xff08;Win11&#xff09;静默打印技术以及PowerShell…

Win11禁止右键菜单折叠的方法

背景 在使用windows11的时候&#xff0c;会发现默认情况下&#xff0c;右键菜单折叠了。以至于在使用一些软件的右键菜单时总是要点击“显示更多选项”菜单展开所有菜单&#xff0c;然后再点击。而且每次在显示菜单时先是全部展示&#xff0c;再隐藏一下&#xff0c;看着着实难…

小试牛刀-区块链代币锁仓(Web页面)

Welcome to Code Blocks blog 本篇文章主要介绍了 [区跨链代币锁仓(Web页面)] ❤博主广交技术好友&#xff0c;喜欢我的文章的可以关注一下❤ 目录 1.编写目的 2.开发环境 3.实现功能 4.代码实现 4.1 必要文件 4.1.1 ABI Json文件(LockerContractABI.json) 4.2 代码详解…

《新华日报》理论版报刊简介及投稿邮箱

《新华日报》理论版报刊简介及投稿邮箱 《新华日报》是中国共产党在抗日战争时期和解放战争初期创办的大型机关报&#xff0c;1949 年 4 月在南京复刊&#xff0c;1952 年成为中国共产党江苏省委机关报&#xff0c;现为中共江苏省委直属事业单位。 该报纸的理论版&#xff08;…

pycharm无法添加python解释器的解决方法

出现该错误的原因是先前创建过重名的解释器&#xff08;虚拟环境&#xff09;&#xff0c;在pycharm配置中没有完全删除干净。解决方法如下&#xff1a; 首先在文件->设置界面&#xff0c;找到解释器设置。 然后先按图所示点击全部显示虚拟环境&#xff1a; 接着将无法添…

Django开发实战(1)- 认识django

1.django 使用MTV模式&#xff0c;其实与MVC本质一样&#xff1a; model&#xff1a;业务对象和关系映射&#xff08;ORM&#xff09; template&#xff1a;客户端页面展示 view&#xff1a;业务逻辑&#xff0c;根据需求调用 2.开发相关 √ python √ html&…

高压开关触指接触压力测试仪 隔离开关触指压紧力测试仪

产品概述 KDGK-2016隔离开关触指压紧力测试仪&#xff0c;只要将测试钳模拟触头的传感器在每对触指接触位置张开一下&#xff0c;就能显示出触指此时的接触压力并记忆。有效解决了测量触指压力的难题。 KDGK-2016隔离开关触指压紧力测试仪也可用于隔离开关制造厂对触指压力的…

工作坊回顾 | 谢宁老师赋能一汽汽车集团开展《从市场洞察到产品规划及产品线端到端经营管理》专题工作坊

工作坊现场快报 近日&#xff0c;《华为战略管理法&#xff1a;DSTE实战体系》作者、著名战略管理专家谢宁老师赋能一汽汽车集团&#xff0c;开展《从市场洞察到产品规划及产品线端到端经营管理》工作坊。 一汽汽车集团相关产品线团队成员&#xff08;涉及到研发、生产、市场、…

备忘:PythonREPL中py_repl.run方法执行报错和修改方法

PythonREPL是python提供的 “Read–Eval–Print Loop”&#xff08;读取-求值-打印-循环&#xff09;的缩写&#xff0c;它是一种简单的、交互式的编程环境&#xff0c;我们之前在用AI生成代码后执行就使用这个方法&#xff0c;例如 def py_repl_tool(self, realcode: str):py…

DLS MARKETS外汇:美指牛市通道稳固,非农数据和美国大选成关键因素

摘要&#xff1a; 尽管近期美国经济数据表现疲弱&#xff0c;但美元指数&#xff08;美指&#xff09;依旧表现平稳。本周五即将公布的6月非农就业数据&#xff0c;以及即将到来的美国总统大选&#xff0c;将成为影响美元走势的关键因素。在技术面上&#xff0c;美指保持在牛市…

npm 淘宝镜像证书过期,错误信息 Could not retrieve https://npm.taobao.org/mirrors/node/latest

更换 npm 证书 问题描述报错原因更换步骤1 找到 nvm 安装目录2 发现证书过期3 更换新地址4 保存后&#xff0c;重新安装成功 问题描述 在使用 nvm 安装新版本时&#xff0c;未成功&#xff0c;出现报错&#xff1a; Could not retrieve https://npm.taobao.org/mirrors/node/l…

数据存储方案选择:ES、HBase、Redis、MySQL与MongoDB的应用场景分析

一、概述 1.1 背景 在当今数据驱动的时代&#xff0c;选择合适的数据存储技术对于构建高效、可靠的信息系统至关重要。随着数据量的爆炸式增长和处理需求的多样化&#xff0c;市场上涌现出了各种数据存储解决方案&#xff0c;每种技术都有其独特的优势和适用场景。Elasticsear…

计算机网络部分知识点整理

停止等待协议的窗口尺寸为 1。 √以太网标准是IEEE802.3TCP/IP四层&#xff0c;OSI模型有7层&#xff0c;地址解析协议 ARP 在 OSI 参考七层协议属于数据链路层&#xff0c;在TCP/IP 协议属于网络层&#xff0c;ARP作用&#xff1a;将 IP 地址映射到第二层地址&#xff0c;交换…

44.实现管理HOOK点的链表对象

上一个内容&#xff1a;43.实现HOOK接管寄存器数据 以 43.实现HOOK接管寄存器数据 它的代码为基础进行修改 首先创建一个类 这里创建的名为HOOKPOINT.h HOOKPOINT.cpp文件里面的内容 #include "pch.h" #include "HOOKPOINT.h"HOOKPOINT::HOOKPOINT() {…

Echarts-折线图

1.案例1 1.1代码 option {"tooltip": {"trigger": "axis","backgroundColor": "rgba(32, 33, 36,.7)","borderColor": "rgba(32, 33, 36,0.20)","borderWidth": 10,"textStyle"…

【LeetCode刷题】3099.哈沙德数

题目链接 3099. 哈沙德数 - 力扣&#xff08;LeetCode&#xff09; 实现代码 int sumOfTheDigitsOfHarshadNumber(int x) {int sum 0;for(int temp x; temp; temp / 10)sum temp % 10;return x%sum ? -1 : sum; }

LSTM水质预测模型实践

0 引言 随着水质自动站的普及&#xff0c;监测频次越来越高&#xff0c;自动监测越来越准确。 水质站点增多&#xff0c;连续的水质监测数据&#xff0c;给水质预测提供更多的训练基础。 长短时记忆网络(LSTM)适用于多变量、连续、自相关的数据预测。 人工神经网络模型特点为的…