ABAP编程中,函数组与ABAP OO编程的相似性

news2025/1/11 23:47:01

任何面向对象模型的核心都是对象,它们包含属性(数据)和方法(函数)。 在传统的ABAP开发过程中,ABAP中对象的最接近等价物是函数模块和函数组。在ABAP编程中,函数组(Function Group)和面向对象编程(ABAP OO)都提供了一种封装数据和操作数据的方法,尽管它们的实现方式有所不同。以下是一个案例,展示了如何在ABAP中使用函数组来模拟面向对象编程的一些特性。

案例:简单的计数器函数组

      在传统的ABAP编程中,我们可能会创建一个函数组来实现一个计数器的功能。这个函数组包含一个全局变量(COUNT)和三个函数模块(SET_COUNTER、INCREMENT_COUNTER、GET_COUNTER),用于设置、增加和获取计数器的值。

FUNCTION-POOL COUNTER.
DATA COUNT TYPE I.
FUNCTION SET_COUNTER.
* Local Interface IMPORTING VALUE(SET_VALUE)
 COUNT = SET_VALUE.
ENDFUNCTION.
FUNCTION INCREMENT_COUNTER.
 ADD 1 TO COUNT.
ENDFUNCTION.
FUNCTION GET_COUNTER.
* Local Interface: EXPORTING VALUE(GET_VALUE)
 GET_VALUE = COUNT.
ENDFUNCTION.

    该函数组有一个全局整数字段COUNT,以及三个与之工作的函数模块,SET_COUNTER、INCREMENT_COUNTER和GET_COUNTER。其中两个函数模块具有输入和输出参数。这些构成了功能组的数据接口。

      任何ABAP程序都可以与此功能组一起工作。例如:

REPORT Y_DEMO_TEST_153
DATA NUMBER TYPE I VALUE 5.
CALL FUNCTION 'SET_COUNTER' EXPORTING SET_VALUE = NUMBER.
DO 3 TIMES.
 CALL FUNCTION 'INCREMENT_COUNTER'.
ENDDO.
CALL FUNCTION 'GET_COUNTER' IMPORTING GET_VALUE = NUMBER.

    程序运行后,程序变量NUMBER的值将为8。程序本身无法访问函数组中的COUNT字段。对该字段的操作完全封装在函数模块中。程序只能通过调用其函数模块与函数组通信。

      在这个案例中,函数组的全局变量COUNT类似于面向对象编程中的类属性,而函数模块则类似于类的方法。这些函数模块提供了与COUNT变量交互的接口,允许外部程序通过这些接口来操作COUNT变量,而不需要直接访问它。

函数组与面向对象编程的相似性:

  1. 封装:函数组通过函数模块封装了对COUNT变量的操作,这与面向对象编程中的封装原则相似,即隐藏内部实现细节,只暴露必要的接口。

  2. 方法:函数组中的函数模块类似于面向对象编程中的对象方法,它们提供了对对象(在这种情况下是COUNT变量)进行操作的途径。

  3. 数据隐藏:函数组不允许外部程序直接访问COUNT变量,这与面向对象编程中的私有属性(private attributes)概念相似,确保了数据的安全性和一致性。

  4. 接口:函数组通过函数模块提供了一个明确的接口,外部程序必须通过这些接口来与函数组交互,这与面向对象编程中的公共方法(public methods)相似。

      尽管函数组在一定程度上模拟了面向对象编程的一些特性,但它们并不完全等同于面向对象编程。在ABAP OO编程中,我们可以创建类(Class),这些类可以包含属性(Attributes)和方法(Methods),并且可以支持继承(Inheritance)、多态(Polymorphism)等更高级的面向对象特性。例如,可以创建一个计数器类,它包含一个私有的计数器属性和一个公共的方法来增加计数器的值,这样就可以创建多个计数器对象,每个对象都有自己的计数器实例。

       作为比较,以下程序示例使用ABAP对象编程来实现一个计数器,达到与上述使用函数的相同功能。


REPORT Y_XF_TEST_153.
CLASS counter DEFINITION.
 PUBLIC SECTION.
 METHODS: set IMPORTING value(set_value) TYPE i,
 increment,
 get EXPORTING value(get_value) TYPE i.
 PROTECTED SECTION.
 DATA count TYPE i.
ENDCLASS.
CLASS counter IMPLEMENTATION.
 METHOD set.
 count = set_value.
 ENDMETHOD.
 METHOD increment.
 ADD 1 TO count.
 ENDMETHOD.
 METHOD get.
     get_value = count.
     write :/1 get_value .
 ENDMETHOD.
ENDCLASS.

DATA: count TYPE REF TO counter,
      number TYPE i VALUE 5 .

START-OF-SELECTION.
  CREATE OBJECT count TYPE counter.
  CALL METHOD count->set EXPORTING set_value = number.
  DO 3 TIMES.
     CALL METHOD count->increment.
  ENDDO.
  CALL METHOD count->get.

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

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

相关文章

lnternet 发展史

一,lnternet 发展史 ARPA net (上世纪50年代二战结束) 无线 战场指挥通信协议落后 TCP/IP 包交换 WEB (70年代 ) 80年代 90年代 二,互联网的典型应用: 96年到2008年 第一代技术…

SwiftUI 中 Grid 内多个 NavigationLink 同时发生导航之诡异问题的解决

问题现象 不知小伙伴们发现了没有?在 SwiftUI 中如果有多个 NavigationLink 视图嵌入在 Grid(包括 LazyVGrid 和 LazyHGrid)容器中,点击其中任意一个 NavigationLink 都会导致所有导航一起发生。 如上图所示,点击 Grid 中任何一个 NavigationLink,所有 NavigationLink 都…

Golang | Leetcode Golang题解之第212题单词搜索II

题目: 题解: type Trie struct {children map[byte]*Trieword string }func (t *Trie) Insert(word string) {node : tfor i : range word {ch : word[i]if node.children[ch] nil {node.children[ch] &Trie{children: map[byte]*Trie{}}}nod…

【Dison夏令营 Day 07】用 Python 和 Rich 制作 Wordle克隆(下篇)

在大流行期间,Wordle 在 Twitter 上还算比较流行的一款基于网络的益智游戏,要求玩家每天在六次或更短时间内猜出一个新的五个字母的单词,每个人得到的单词都是一样的。 在本教程中,你将在终端上创建自己的 Wordle 克隆。自 2021 …

java基于ssm+vue 病人跟踪治疗信息管理系统

1病人功能模块 病人登录进入病人跟踪治疗信息管理系统可以查看首页、个人中心、病例采集管理、预约管理、医生管理、上传核酸检测报告管理、上传行动轨迹管理、病人治疗状况管理等内容。 病例采集管理,在病例采集管理页面可以查看账号、姓名、住院号、入院时间、病…

华三多台交换机堆叠配置(环形组网)

组网架构 配置步骤 SW1的配置: irf member 1 priority 32 设置master的优先级为32 interfacec range Ten-GigabitEthernet1/0/49 to Ten-GigabitEthernet1/0/50 shutdown 关闭上述接口(将其加入到堆叠口之前需要关闭,否则无法加入&a…

SpringBoot 项目整合 MyBatis 框架,附带测试示例

文章目录 一、创建 SpringBoot 项目二、添加 MyBatis 依赖三、项目结构和数据库表结构四、项目代码1、application.yml2、TestController3、TbUser4、TbUserMapper5、TestServiceImpl6、TestService7、TestApplication8、TbUserMapper.xml9、MyBatisTest 五、浏览器测试结果六、…

语音大模型引领自然交互新时代,景联文科技推出高质量语音大模型数据库

近期,OpenAI正式发布语音大模型GPT-4o,可以综合利用语音、文本和视觉信息进行推理,扮演一个个人语音交互助手。 在音频处理方面,它不仅能识别和转录多种口音和方言,改变语音的速度音调和振动,还能进行声音模…

中国桥梁空间分布数据

2020年中国桥梁空间分布数据,共包含102000余条数据。 数据属性表包括:地级市名、区县名、桥梁名称和经纬度。有shp和EXCEl两种格式数据。目前暂没有广西、广东和台湾三个省份数据。

新创建spring项目打包启动直接报错没有主清单

springboot程序打成jar包执行报错: 启用 repackage 目标: 将 true 注释以启用 repackage 目标。 这样会确保在构建过程中生成具有正确清单属性的可执行 JAR 文件。

石墨烯分散液制备方法众多 应用领域广泛

石墨烯分散液制备方法众多 应用领域广泛 石墨烯分散液指将石墨烯纳米片均匀分散在特定溶剂中制成的溶液。石墨烯分散液具有化学稳定性好、生物相容性好、热稳定性好等优势,未来有望在涂料、纤维制品、电池制造、油墨等领域获得广泛应用。 石墨烯分散液以石墨…

银河麒麟V10SP1Nginx代理转发故障socket() failed (24: Too many open files)修改操作系统ulimit值解决实战

银河麒麟V10SP1Nginx代理转发故障socket() failed (24: Too many open files)修改操作系统ulimit值解决实战 一、事故描述 Nginx转发失败,转发代理服务器宕机! 翻看Nginx日志 /var/log/nginx日志大量报错如下: socket() failed (24: Too m…

sklearn(Python机器学习库)介绍

0 引言 Sklearn (全称 Scikit-Learn)是基于Python 编程语言的免费软件机器学习库。 Scikit-learn主要是用Python编写的,它建立在 NumPy, SciPy, Pandas 和 Matplotlib 之上,里面API 的设计非常好,所有对象的接口简单,很适合新手上路。 Scikit-learn与许多其他Python库很好地…

Zookeeper:Zookeeper集群角色

文章目录 一、Leader选举二、Zookeeper集群角色 一、Leader选举 Serverid:服务器ID;比如有三台服务器,编号越大在选择算法中的权重越大。Zxid:数据ID;服务器中存放的最大数据ID,值越大说明数据越新&#x…

携手共筑爱的桥梁:引导接纳自闭症同学

在孩子的班级中,当自闭症儿童成为我们共同的一员时,作为老师和家长,我们肩负着特别的责任——引导孩子们以开放的心态接纳、善待并关爱他们。 首先,我们要以身作则,展现接纳与尊重。无论是老师还是家长,都…

vue3自定义指令(图文教程)

序: 简单,但是没怎么用,但是小伙伴问了,所以做个教程。 自定义指令我只关心3件事 干啥用的,怎么用的,解决什么痛点怎么全局博文有查阅及参考过以下文章, vue3:自定义指令_vue3自定…

深度学习实战82-新的研究方向:大模型与图模型结合生成大型图模型,大图模型相关挑战和机遇的观点

大家好,我是微学AI,今天给大家介绍一下深度学习实战82-新的研究方向:大模型与图模型结合生成大型图模型,大图模型相关挑战和机遇的观点。随着人工智能的飞速发展,大型模型已成为人工智能领域最新的突破性成就。在图方面,大型模型尚未取得与自然语言处理和计算机视觉等其他…

14-15 为什么我们现在对阅读如此难以接受

写出来感觉很奇怪,但最近我感觉自己失去了阅读能力。长篇文本对我来说尤其具有挑战性。句子很难读完。更别提章节了。章节有很多段落,而段落又由许多句子组成。 啊。 即使在极少数情况下,我读完了一章,下一页上已经有另一章等着…

Next.js 实战 (一):项目搭建指南

前言 时间过得好快,一下就来到2024下半年了。 上半年我为了学习 Nuxt3,从 0 到 1 开发了一个导航网站:Dream Site,目前主要的功能都已完成了,后续有时间再慢慢添加有趣的功能。 下半年开始进攻 Next.js,…

关于 VuePress 的插件

插件就好比第三方功能,例如增加一个阅读进度条、增加光标效果等。VuePress 官网对插件的介绍:插件通常会为 VuePress 添加全局功能。 这里简单介绍几个本站用的插件吧! ‍ ‍ 插件就好比第三方功能,例如增加一个阅读进度条、增…