ABAP面向对象开发

合集下载

abap 类的定义

abap 类的定义

abap 类的定义ABAP(Advanced Business Application Programming)是一种专门用于SAP系统开发的编程语言。

在ABAP中,可以使用类(Class)来面向对象地组织和封装代码。

以下是在ABAP中定义类的基本语法:```ABAPCLASS <类名> DEFINITION.PUBLIC SECTION." 在这里定义公共部分,包括属性和方法DATA: <属性1> TYPE <数据类型>,<属性2> TYPE <数据类型>.METHODS:constructor,<方法1>,<方法2>.PROTECTED SECTION." 在这里定义受保护的部分,只能在类的继承层次结构内访问PRIVATE SECTION." 在这里定义私有的部分,只能在当前类中访问ENDCLASS.CLASS <类名> IMPLEMENTATION.METHOD constructor." 在这里编写构造方法的实现" 构造方法用于初始化对象的属性ENDMETHOD.METHOD <方法1>." 在这里编写方法的实现ENDMETHOD.METHOD <方法2>." 在这里编写方法的实现ENDMETHOD.ENDCLASS.```上述代码中,`<类名>` 是你为类指定的名称,`<属性1>`, `<属性2>` 是类的属性,`<方法1>`, `<方法2>` 是类的方法。

类的定义部分包含了三个部分:`PUBLIC SECTION`,`PROTECTED SECTION`,和`PRIVATE SECTION`,分别表示公共部分、受保护的部分和私有部分。

-公共部分包含了可以被外部代码访问的属性和方法。

SAP ABAP开发者必备技能

SAP ABAP开发者必备技能

SAP ABAP开发者必备技能SAP是企业级的软件系统,而ABAP是SAP的编程语言。

ABAP的全称是Advanced Business Application Programming,是一种高级商业应用编程语言。

SAP ABAP开发者必备技能是指那些在使用ABAP进行开发时必需的技能和知识。

在本文中,我将探讨SAP ABAP开发者必备技能。

一、扎实的ABAP编程基础要成为一名SAP ABAP开发者,首先必须具备扎实的ABAP编程基础。

ABAP是一种面向对象的编程语言,与其他语言(例如Java、C#)相比,ABAP的应用场景更为专业和特定。

曾经学习过其他编程语言的人们可能会发现ABAP与它们之间存在很多的差距和限制。

因此,建议在学习ABAP之前先了解其基础,包括各种数据类型、控制语句、函数以及模块等等。

同时学习SAP的数据结构和业务流程结构也是非常重要的。

二、掌握SAP的业务逻辑作为企业级软件系统,SAP需要满足多种复杂的业务逻辑。

因此,成为一名SAP ABAP开发者需要了解SAP系统的业务流程,并且需要理解这些业务流程是如何在SAP系统上实现的。

了解业务逻辑对于优化开发工作流程和代码的质量非常重要。

三、良好的数据库基础知识SAP系统最主要的功能是管理企业的各种数据,因此对于SAP ABAP开发人员来说,必须具备良好的数据库基础知识,包括SQL语句的编写和数据库设计。

学习ABAP开发不仅是阅读和编写代码,还涉及到数据库操作、数据导入和导出等方面的知识。

数据的有效管理是SAP ABAP开发工作的关键,它对于SAP系统的各个部分都非常重要,包括数据迁移、调试、性能优化等等。

四、熟悉SAP的层级结构和模块SAP系统具有复杂的层级结构和模块,SAP ABAP开发人员需要理解SAP系统中的每个分层结构和模块的应用方式。

有效的掌握层级结构和模块有助于更好的理解整个系统的技术架构,并且可以快速开发和测试SAP的应用程序。

abap 实现原理

abap 实现原理

abap 实现原理ABAP,全称为Advanced Business Application Programming,是SAP的一种编程语言,用于开发和定制SAP软件。

ABAP是一种高级的、面向对象的编程语言,它的实现原理包括语法结构、数据类型、运行环境等方面。

ABAP的语法结构是其实现原理的基础。

ABAP语言采用类似于面向对象编程的结构,包括类、方法、变量等概念。

在ABAP中,一个类包含了一组相关的方法和属性,可以通过实例化来创建对象,并通过调用方法来实现相应的功能。

ABAP的语法结构严谨而规范,使得程序员能够清晰地表达自己的意图,并且方便阅读、维护和调试程序。

ABAP的数据类型也是实现原理的重要部分。

ABAP支持各种基本数据类型,如整数、浮点数、字符串等,同时也支持复合数据类型,如结构体、表格等。

这些数据类型可以用于定义变量、参数、返回值等,并且可以通过内置的函数和操作符来进行操作和计算。

ABAP 的数据类型设计合理,能够满足各种业务需求,并提供了丰富的类型转换和处理函数,使得程序开发更加灵活和高效。

ABAP的运行环境是实现原理中不可或缺的一部分。

ABAP程序在SAP系统中运行,它利用SAP的运行时环境来执行。

ABAP运行时环境包括解释器、编译器、调试器等组件,通过这些组件可以将ABAP代码转换为机器可执行的指令,并在SAP系统中进行执行。

ABAP运行时环境还提供了丰富的调试和性能分析工具,帮助开发人员快速定位和解决问题。

ABAP的实现原理还涉及到与数据库的交互。

ABAP程序可以通过SAP提供的数据库接口与数据库进行交互,包括数据查询、增删改操作等。

ABAP提供了丰富的数据库访问函数和语句,使得开发人员可以方便地操作数据库,并且能够高效地处理大量的数据。

除了语法结构、数据类型和运行环境外,ABAP的实现原理还包括一些特殊功能和技术。

例如,ABAP支持事务处理,可以通过事务代码来将一组相关的操作组合在一起,并且可以保证这组操作的原子性和一致性。

abap class 解读

abap class 解读

abap class 解读ABAP Class 解读ABAP(Advanced Business Application Programming)是一种基于SAP系统的编程语言,被广泛用于开发企业级应用程序。

在ABAP中,Class是一种重要的概念和编程结构,用于实现面向对象编程(OOP)的原则。

在本文中,我们将一步一步地解读ABAP Class的相关概念、特性和用法,帮助读者更好地理解和应用这一重要的编程工具。

一、什么是ABAP ClassABAP Class是一种面向对象编程(OOP)的核心概念,在ABAP中用于定义对象和对象的行为。

一个Class可以包含属性(Attributes)和方法(Methods),以及相关的事件(Events)和异常(Exceptions)。

通过Class的实例化(Instantiation),我们可以创建具体的对象,然后调用对象的方法来执行相应的逻辑。

在ABAP中,每个Class都有一个唯一的名字,以及可选的访问修饰符(Public、Private、Protected)。

Public修饰符表示其他对象可以直接访问该Class及其成员;Private修饰符表示只有该Class内部的方法才可以访问;Protected修饰符表示该Class及其子类可以访问。

二、ABAP Class的组成部分一个典型的ABAP Class由以下几个组成部分组成:1. Class声明(Class Declaration):用于定义Class的名字、可选的继承关系和接口(Interface)实现。

2. 属性(Attributes):Class的成员变量,用于保存对象的状态信息。

属性可以有不同的数据类型(如整数、字符串等),以及可选的访问修饰符和初始值。

3. 方法(Methods):Class的成员函数,用于执行特定的逻辑。

方法可以有输入参数(Importing)、输出参数(Exporting)、输入输出参数(Changing)和异常参数(Raising),以及可选的访问修饰符。

abap开发知识点

abap开发知识点

ABAP开发知识点ABAP(Advanced Business Application Programming)是SAP系统中的编程语言,主要用于开发和定制SAP应用程序。

在本文中,我们将介绍ABAP开发的一些重要知识点。

一、ABAP语言基础1.数据类型:ABAP支持多种数据类型,包括整数、浮点数、字符型、日期型等。

了解不同数据类型的使用方法和限制是编写高效代码的关键。

2.变量和常量:在ABAP中,我们可以使用DATA语句定义变量,并使用CONSTANTS语句定义常量。

熟悉变量和常量的使用方式可以提高代码的可读性和维护性。

3.控制结构:ABAP提供了多种控制结构,如IF语句、CASE语句和循环语句等。

掌握这些控制结构的使用方法可以实现条件判断和循环操作。

二、ABAP面向对象编程1.类和对象:ABAP支持面向对象编程,可以定义类和对象。

了解类的概念和对象的创建方式可以提高代码的可重用性和可维护性。

2.成员方法和属性:在ABAP类中,我们可以定义成员方法和属性。

掌握这些概念的使用方法可以实现类的封装和功能扩展。

3.继承和多态:ABAP支持继承和多态的特性。

熟悉这些特性的使用方式可以简化代码的编写,提高代码的可扩展性。

三、ABAP数据库访问1.数据库表的定义和操作:ABAP可以创建和操作数据库表。

了解数据库表的定义和操作方式可以实现数据的存储和检索。

2.SQL语句的使用:在ABAP中,我们可以使用SQL语句进行数据库操作。

熟悉SQL语句的使用方式可以实现复杂的数据查询和更新。

3.事务处理:ABAP支持事务处理的机制,可以保证对数据库的操作的一致性和完整性。

了解事务处理的使用方式可以避免数据错误和数据丢失。

四、ABAP调试和错误处理1.调试技巧:ABAP提供了调试工具,可以帮助我们查找和修复代码中的错误。

掌握调试技巧可以快速定位问题,并提高代码的质量。

2.异常处理:在ABAP中,我们可以使用TRY…CATCH语句来处理异常。

abap 开发手册

abap 开发手册

abap 开发手册ABAP(Advanced Business Application Programming)是一种适用于SAP软件系统的编程语言,具有丰富的功能和广泛的应用。

本文将介绍ABAP开发的基本概念和技巧,以帮助初学者入门并提高开发效率。

一、ABAP简介ABAP是一种面向对象的编程语言,它被广泛用于SAP软件的开发和定制。

ABAP程序旨在实现企业管理和业务流程的自动化,从而提高组织的效率和竞争力。

ABAP开发环境通常由ABAP编辑器、ABAP Dictionary、ABAP调试器等组成。

ABAP编辑器用于编写和修改ABAP程序代码,ABAP Dictionary用于定义数据结构,ABAP调试器用于调试程序和定位错误。

二、ABAP语法和基本概念1. ABAP程序结构ABAP程序由一系列的语句组成,每个语句由关键字和操作数组成。

ABAP程序通常以“PROGRAM”关键字开头,后跟程序名称和其他程序头信息。

程序的主体部分由一系列的模块组成,每个模块由“MODULE”关键字定义。

2. 数据类型和变量ABAP提供了丰富的数据类型,包括整数、字符、日期、时间、结构体等。

变量可以通过“DATA”关键字声明,并可以为其指定初始值。

3. 控制结构和循环ABAP支持各种控制结构和循环语句,如条件语句、循环语句、逻辑操作等。

这些语句可以帮助开发人员根据需要执行相应的逻辑。

三、ABAP开发的常用技巧1. ABAP调试ABAP调试器是一种强大的工具,可以帮助开发人员在运行时检查和调试ABAP程序。

通过设定断点,开发人员可以暂停程序的执行,查看变量的值,以及逐步执行程序进行调试。

2. ABAP注释在编写ABAP程序时,良好的注释是非常重要的。

它可以帮助他人理解代码的用途和逻辑,也可以帮助开发人员在以后的维护中快速定位和解决问题。

3. ABAP性能优化优化ABAP程序的性能可以提高程序的执行效率和响应速度。

一些常用的优化技巧包括使用内表和数据库表的合适索引、避免冗余的代码和循环等。

abap 主要知识点

abap 主要知识点

abap 主要知识点ABAP(Advanced Business Application Programming)是一种用于开发企业级业务应用程序的编程语言,主要应用于SAP业务软件系统中。

ABAP主要用于实现和定制SAP ERP、SAP S/4HANA等企业资源规划系统。

以下是ABAP主要知识点:1.基本语法:ABAP的基本语法包括数据类型、变量、常量、运算符、流程控制、函数、过程、模块等。

2.数据结构:ABAP中常用的数据结构有数组、表格、链表、树形结构等。

3.界面设计:ABAP可用于设计用户界面,包括对话框、菜单、报表等。

4.数据库操作:ABAP支持对数据库的CRUD(创建、读取、更新、删除)操作,主要包括SQL语句、数据定义、数据存取等。

5.报表设计:ABAP具有强大的报表设计功能,可以创建各种复杂程度的报表,如分组报表、多级报表、交叉报表等。

6.常用ABAP组件:ABAP中有一些常用的组件,如逻辑块(ALV)、数据字典(DDIC)、报表框架(BDC)、界面事件(BEL)、用户自定义函数(FC)等。

7.企业对象组件(EPC):EPC是ABAP的一种企业级组件,用于实现业务过程的自动化。

8.工作流:ABAP支持工作流编程,可以实现业务流程的建模、调度和监控。

9.对象化编程:ABAP支持面向对象的编程,可以实现代码的复用和模块化。

10.接口技术:ABAP接口用于实现与其他系统(如HR、CRM等)的集成。

主要包括BAPI、BDC、IDoc等。

11.性能优化:ABAP程序的性能优化是开发者关注的重要议题,包括SQL优化、代码优化、内存管理等。

12.ABAP开发工具:常用的ABAP开发工具包括ABAP Workbench、SE80/SE81、SAP NetWeaver Developer Studio 等。

13.脚本语言:ABAP脚本语言(Scripting)用于实现与ABAP程序的交互和自动化。

abap中的功能用法

abap中的功能用法

ABAP(Advanced Business Application Programming)是一种高级商业应用程序编程语言,主要用于SAP系统的开发。

下面将对ABAP中的功能用法进行全面阐述,包括定义、用法、重点、难点和注意事项等方面,并附有应用案例。

一、定义ABAP是一种面向对象的语言,用于开发SAP系统的功能模块、报表、界面等。

它是一种高级编程语言,能够简化SAP系统的开发过程,提高开发效率和代码质量。

二、用法1.定义变量和方法在ABAP中,可以使用声明语句来定义变量和方法。

变量是用来存储数据的标识符,而方法是用来执行特定操作的函数。

例1:定义一个整数型变量i,并将其赋值为10。

例2:定义一个方法get_sum,用于计算两个数的和。

2.条件语句和循环语句在ABAP中,可以使用条件语句和循环语句来实现程序的逻辑控制。

条件语句用于根据条件执行不同的操作,而循环语句则用于重复执行特定的操作。

例3:使用条件语句判断一个数是否为偶数。

例4:使用循环语句计算1到10的和。

3.事务代码和报表输出在ABAP中,可以使用事务代码和报表输出功能来实现与用户的交互。

事务代码用于执行特定的业务流程,而报表输出功能则可以将查询结果以表格或报表的形式呈现给用户。

例5:使用事务代码SE38执行一个程序。

在命令行输入事务代码SE38,输入程序名,按Enter键执行程序。

三、重点1.熟练掌握ABAP语法和程序结构,能够编写简单的程序和函数。

2.了解SAP系统的数据模型和业务逻辑,能够根据实际需求进行程序设计。

3.掌握ABAP中的常用函数和工具,如数据转换函数、文本处理函数、报表输出等。

4.了解ABAP程序的调试和测试方法,能够进行程序调试和性能优化。

四、难点1.ABAP中的复杂语法和程序结构,如条件判断、循环控制、异常处理等。

2.与其他系统的集成和交互,如与SAP系统外的数据库或应用程序的接口开发。

3.理解SAP系统的业务逻辑和数据模型,能够根据业务需求进行程序设计。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在程序中, 对象的识别和寻址是通过对象引用来实现的, 对象引用变量可以访问对象的属性和方法.ABAP 中的类也有程序内部的局域类和全局类之分, 其作用范围不同. ABAP中的全局类是通过ABAP工作台中的类创建工具Class Builder 开发的, 保存在系统类库程序Class Pool 中, 可供所有程序作用.一. 程序中类的定义.1. 类声明及实现* Class DeclarationsCLASS application DEFINITION.PUBLIC SECTION.METHODS: show_text.PRIVATE SECTION.DATA text(100) TYPE c VALUE 'This is my first ABAP Object.'.ENDCLASS.CLASS application IMPLEMENTATION.METHOD show_text.WRITE text.ENDMETHOD.ENDCLASS.2. 成员可见性.公有: 可被所有对象使用.PUBLIC SECTION.保护: 只能被本类及其派生类中的方法使用.PROTECTED SECTION.私有: 只能被类本身的方法所使用.PRIVATE SECTION.公有部分常常用来定义类的方法, 而类属性则一般定义为类的私有或保护数据, 只能通过自身或其派生类的方法来操作.3. 成员类型.可定义三种不同类型的成员, 分别是属性, 方法和事件.属性是在类内部的数据对象, 对于实例属性, 用DATA 定义, 语法与数据对象声明相同;对于静态属性(类属性), 使用CLASS-DATA 语句定义, 在类的声明部分定义.* Class DeclarationsCLASS application DEFINITION.PUBLIC SECTION.CLASS-DATA class_name(10) type c value 'Vehicle'. "静态属性PRIVATE SECTION.DATA speed TYPE i.ENDCLASS.对于公有组件还可以在属性定义语句中增加READ-ONLY 关键字, 则该属性不能被类外部读取但可被类的内部方法所修改.除DATA 外, 也可以使用CONSTANT 语句定义类常量, 必须在类定义时指定其值.使用TYPES 语句在类中定义的数据类型, 相当于静态属性, 其定义方法与普通ABAP 程序类似.类方法需要在类的声明和实现两部分进行定义, 在类的声明部分说明方法的参数接口, 在实现部分则通过ABAP 代码完成具体的功能.方法的声明关键字为METHODS 和CLASS-METHODS.METHODS methIMPORTING ... i1 TYPE ...EXPORTING ... e1 TYPE ...CHANGING ... c1 TYPE ...EXCEPTIONS ... x1 TYPE ...定义了方法及方法的参数接口, 和FORM 相似, 但没有TABLES 参数. CLASS vehicle DEFINITION.PUBLIC SECTION.CLASS-DATA class_name(10) TYPE c VALUE 'Vehicle'.METHODS: accelerate,show_speed.PRIVATE SECTION.DATA speed TYPE i.ENDCLASS.CLASS vehicle IMPLEMENTATION.METHOD accelerate.speed = speed + 1.ENDMETHOD.METHOD show_speed.WRITE: / 'Speed: ', speed.ENDMETHOD.ENDCLASS.二. 定义系统全局类.通过Class Builder 工具在类型为K 的ABAP 类库程序中定义. 如果在一个程序中使用该类, 则整个类库将被载入到程序内存中.1. 全局类定义.可以用SE80 或SE24 进入Class Builder 进行创建.使用全局类.REPORT z_af_049.DATA: ob_veh1 TYPE REF TO z_cl_vehicle1.START-OF-SELECTION.CREATE OBJECT ob_veh1.CALL METHOD ob_veh1->show_speed.三. 程序中的类实例.使用对象的步骤如下:1) 定义类的声明和实现方法;2) 使用DATA 语句中的TYPE REF TO参照类类型声明引用变量;3) 使用CREATE OBJECT 语句创建对象;4) 通过-> 或=> 运算符访问对象或类组件;1. 对象创建与引用;ABAP 对象的创建和访问需要通过对象引用进行, 引用类型是ABAP基本类型之一, 其中包括数据引用和对象引用,其中对象引用又包括类引用和接口引用. 对于普通类来说, 应使用类引用.在程序中, 需要先根据对象类型声明引用类型变量, 然后对该变量引用ABAP对象, 该引用变量中实际上存储的是ABAP对象的内在地址, 因而该引用类型变量也就是普通意义上的指向对象的指针.一个引用类型变量可以不指向任何内存地址或指向一个数据对象, 但一个ABAP对象则可以同时存在多个指向它的指针,可以通过所有这些指针对其进行操作.DATA ob_vehicle TYPE REF TO vehicle.CREATE OBJECT ob_vehicle.其中DATA语句创建了一个引用数据对象, 该数据对象的类型定义为"指向一个类为vehicle的对象的指针".定义指针之后, CREATE OBJECT 语句则创建了一个类vehicle的实例, 并同时将该对象的地址指针赋给引用类型ob_vehicle. 实际情况如下图所示:引用类型与其它类型的数据类型相同, 同类型变量之间也可以相互赋值, 成功赋值之后二者将指向相同的对象.2. 访问对象组件.对象创建之后, 可以通过指向它的指针(引用变量)对其进行操作. 可以使用的对象组件一般为当前可见的属性和方法, 通过引用变量后接运算符-> 访问对象组件. -> 即可以访问类中定义的实例组件又可以访问静态组件. 但对于静态组件还有另一种访问方式, 通过类名称本身=>直接访问.oref->comp其中oref代表引用变量, comp 代表类成员.class=>comp其中class代表类名.由于引用类型变量本身也可以被定义为类属性, 因而可以出现下述的链式访问结构:oref1->oref2->comp或者class=>oref->comp上述的两种运算符是类的外部访问, 在某些情况下, 对象本身需要知道本身的地址, 可以使用局部引用变量ME,该变量隐式的存在于所有的实例方法中, 当方法被调用时, 该变量将包含自身的地址指针, 这种用法称为对象的自身引用.3. 删除对象对象占据程序内存, 如果有后续程序中不再使用的对象, 应该将其删除, 系统对象的删除操作与引用变量有关, 系统将自动定时进行检测, 如果一个对象不再被任何变量引用, 则将其删除, 并释放其所占的内存, 这个操作是通过垃圾回收机制来完成的.垃圾回收机制定时的清除不再使用的对象, 使用CLEAR 语句初始化所有指向该对象的引用变量或者将引用变量的值改变, 都将触发回收机制.四. 方法.1. 参数的定义和传递.类方法的参数接口部分在在类声明部分通过METHODS语句定义的, 而且该接口不需要在类的实现部分再次出现, 参数接口的详细语法形式为:METHODS methIMPORTING ... [VALUE(i1)|i1] TYPE type [OPTIONAL|DEFAULT def1] ...EXPORTING ... [VALUE(e1)|e1] TYPE type [OPTIONAL] ...CHANGE ... [VALUE(c1)|c1] TYPE type [OPTIONAL|DEFAULT def1] ...RETURNING VALUE(r)EXCEPTIONS ... X1 ...2. 调用方法时, 除去指定为可选的参数之外, 所有的参数都必须传递相应的实参值.CALL METHOD [oref->|class=>]methEXPORTING ... i1 = f1 ...IMPORTING ... e1 = g1 ...CHANGING ... c1 = c1 ...RECEIVING r = hEXCEPTIONS ... x1 = rc1 ...该语句格式适用于包括类内部直接调用, 实例调用(oref->)和静态调用(class=>)三种情况. 其中参数定义时用IMPORTING选项指定的形参i 此时将接受CALL METHOD 语句中用EXPORTING 中传递的实参f; 而用EXPORTING 选项指定的形参e 此时将通过IMPORTING 选项传递给实参g.如果方法中只包含输入参数, 而没有输出参数, 则可以使用下列几种形式的简略形式对参数进行调用.CALL METHOD [oref->|class=>]method().CALL METHOD [oref->|class=>]method(f).CALL METHOD [oref->|class=>|method(...i1 = f1 ...).Example:CLASS vehicle DEFINITION.PUBLIC SECTION.CLASS-DATA class_name(10) TYPE c VALUE 'Vehicle'.METHODS: show_speed,accelerate importing rate type i.PRIVATE SECTION.DATA speed TYPE i.ENDCLASS.CLASS vehicle IMPLEMENTATION.METHOD accelerate.speed = speed + rate.ENDMETHOD.METHOD show_speed.WRITE: / 'Speed: ', speed.ENDMETHOD.ENDCLASS.DATA: ob_veh TYPE REF TO vehicle.START-OF-SELECTION.CREATE OBJECT ob_veh.call method ob_veh->accelerate exporting rate = 2.call method ob_veh->accelerate exporting rate = 2.call method ob_veh->show_speed.方法还可以进行动态调用, 即通过变量对方法名进行指定, 例如下列语句: meth = accelerate.CALL METHOD ob_veh->(meth).实参的动态传递:CALL METHOD [oref->|class=>]methPARAMETER-TABLE ptabEXCEPTION-TABLE etab.其中实参必须在程序中放置在两个特定类型的内表中, 传递给方法, 其中参数表ptab可以参照类型组ABAP_PARMBID(行类型)和ABAP_PARMBIND_TAB(表类型)生成; 异常表etab 可以参照ABAP_EXCBIND(行类型)和ABAP_EXCBIND_TAB(表类型)生成.3. 函数方法.函数也是一种过程模块, 其特殊之处是在调用时可以使用操作符(=)来替代过程调用语句, 并可作为操作数直接应用于操作语句中, 因为函数只返回一个唯一的值. 在ABAP Objects 语法中, 可以用例如函数方法来实现这种函数功能, 形式如下:METHODS methIMPORTING ... [ VALUE(i1)|i1] TYPE type [OPTIONAL|DEFAULT def1] ...RETURNING VALUE(r).一个函数方法可以有多个数量的输入参数, 但只能有一个输出参数, 且该输出参数必须为值传递而且需要完成限定其类型.函数方法的调用格式如下:CALL METHOD [oref->|class=>]methEXPORTING ... i1 = f1 ...RECEIVING r = h.简化的调用形式如下:... [oref->|class=>]method( ) ...... [oref->|class=>]method(f) ...... [oref->|class=>]method(... i1 = f1 ...) ...CLASS circle DEFINITION.PUBLIC SECTION.METHODS get_area IMPORTING value(i_radius) TYPE iRETURNING value(r_size) TYPE f.PRIVATE SECTION.CONSTANTS pi TYPE f VALUE '3.1415926'.ENDCLASS.CLASS circle IMPLEMENTATION.METHOD get_area.r_size = i_radius ** 2 * pi.ENDMETHOD.ENDCLASS.DATA: ob_circle TYPE REF TO circle,area TYPE f.PARAMETERS: radius TYPE i.START-OF-SELECTION.CALL METHOD ob_circle->get_areaEXPORTINGi_radius = radiusRECEIVINGr_size = area.WRITE: / area.area = ob_circle->get_area( radius ).WRITE: / area.4. 构造和析构方法.1). 构造方法是运行时环境自动调用的一种方法, 用于为对象设定一个初始化状态, 不能在程序运行过程中由程序代码调用. 实例构造方法在每一次对象创建的过程中(CREATE OBJECT语句时)被系统调用, 如果在类声明部分进行声明, 则需要在实现部分进行代码实现.METHODS constructorIMPORTING ... [VALUE(i1)|i1] TYPE type [OPTIONAL|DEFAULT def1] ... EXCEPTIONS ... e1 ...构造方法中不包含任何形式的输出参数, 其功能只是定义对象状态, 而不是对其进行改变.类构造方法属于静态方法, 只在程序中被调用一次, 即第一次使用该类时调用, 该方法也必须在公有部分声明, 其名称必须为CLASS_CONSTRUCTOR.CLASS-METHODS class_constructor.类构造方法不包含接口, 而且在其中只能访问类的静态属性.REPORT z_af_049.* Class DeclarationsCLASS vehicle DEFINITION.PUBLIC SECTION.CLASS-DATA class_name(10) TYPE c VALUE 'Vehicle'.METHODS: show_speed,accelerate IMPORTING rate TYPE i,constructor IMPORTING i_speed TYPE i. "构造函数PRIVATE SECTION.DATA speed TYPE i value 0.ENDCLASS.CLASS vehicle IMPLEMENTATION.METHOD constructor.speed = i_speed.ENDMETHOD.METHOD accelerate.speed = speed + rate.ENDMETHOD.METHOD show_speed.WRITE: / 'Speed: ', speed.ENDMETHOD.ENDCLASS.DATA: ob_veh TYPE REF TO vehicle.START-OF-SELECTION.CREATE OBJECT ob_veh exporting i_speed = 4. "构造函数CALL METHOD ob_veh->show_speed.CALL METHOD ob_veh->accelerateEXPORTINGrate = 2.CALL METHOD ob_veh->accelerateEXPORTINGrate = 2.CALL METHOD ob_veh->show_speed.五. 继承ABAP 所有的类都是默认继承了系统中的空类OBJECT.具有一般性的类称为基类(Superclass), 其各个子类称为派生类(Subclass).在类定义时, 使用INHERTING FROM 附加项可以指定派生类和基类之间的继承关系.CLASS c2 DEFINITION INHERITING FROM c1....ENDCLASS.ABAP 中的继承为单一继承, 即一个类可以有多个派生类, 但只能有一个直接基类.在继承过程中各成员的组件可见性如下:一个派生类中的公有成员包括其本身公有部分定义的成员以及所有基类公有成员, 这些公有成员可以通过选择运算符"->" 在类外部获得.一个派生类中的被保护成员包括其本身被保护部分定义的成员以及所有基类的被保护成员. 这些成员不能通过组件选择运算符"->" 在类外部获得, 但可以在派生类内部使用. 在类外部看, 其行为与类私有成员完全一致.一个派生类中的私有成员只包括其本身私有部分定义的成员. 这些成员只能在派生类内部使用.因而, 继承类和基类的公有成员和被保护成员享有共同的命名空间, 而私有成员则在不同类之间可以出现重名情参照基类声明的引用变量可以指向其继承类的对象, 如上图所示, 对象n 是类Class3的一个实例, 而左侧的三个引用变量CREF1, CREF2, CREF3 则分别参数类Class1, Class2, Class3 生成. 这三个类存在继承关系. 参考基类声明的引用变量也可以指向其派生类, 即三个变量均可以指向对象n, 但要注意的是CREF1 只能访问Class1 的公有组件, 而CREF2 可以访问Class1 和Class2的公有组件, CREF3 则可以访问全部类的公有组件.但特别要注意的是: 尽管基类引用变量可以指向其继承类对象, 然而反之则被视为错误的类型转换.多态性的继承实现.在继承中, 多态性是通过方法重载及引用变量实现的, 即子类可以重新定义并以不同的方式实现基类中的公有或保护方法, 此时基类中的方法需为实例方法.在派生类中要这样声明:METHOD meth REDEFINITION.该方法必须和基类中的方法具有相同的接口, 但可以通过不同的代码实现.在方法重载过程中, 如果在派生类内部仍然需要使用基类中的方法, 则可以使用SUPER 关键字来指定其基类.CALL METHOD super->meth.Example:*&---------------------------------------------------------------------**& Report Z_AF_050*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORT z_af_050.CLASS class1 DEFINITION INHERITING FROM object. "基类PUBLIC SECTION.METHODS: accelerate,write_status.PROTECTED SECTION.DATA: speed TYPE i.ENDCLASS.CLASS plane DEFINITION INHERITING FROM class1.PUBLIC SECTION.METHODS: rise,write_status REDEFINITION. "多态PROTECTED SECTION.DATA altitude TYPE i.ENDCLASS.CLASS ship DEFINITION INHERITING FROM class1.PUBLIC SECTION.METHODS: write_status REDEFINITION. "多态ENDCLASS.CLASS class1 IMPLEMENTATION.METHOD accelerate.speed = speed + 1.ENDMETHOD.METHOD write_status.WRITE: / 'Speed:', speed.ENDMETHOD.ENDCLASS.CLASS plane IMPLEMENTATION.METHOD rise.altitude = altitude + 2.ENDMETHOD.METHOD write_status.WRITE: 'Plane:'.CALL METHOD super->write_status.WRITE: / 'Altitude:', altitude.ENDMETHOD.ENDCLASS.CLASS ship IMPLEMENTATION.METHOD write_status.WRITE: / 'Ship speed:', speed.ENDMETHOD.ENDCLASS.DATA: plane_ref TYPE REF TO plane.DATA: ship_ref TYPE REF TO ship.START-OF-SELECTION.CREATE OBJECT: plane_ref,ship_ref.CALL METHOD: plane_ref->accelerate,plane_ref->rise,plane_ref->write_status,ship_ref->accelerate,ship_ref->write_status.抽象类和抽象方法.一个基类可能包含多个派生类, 但该基类只是作为模板出现的, 并不需要有任何对象作为实例, 则可以将该类声明为抽象类(Abstract Class).CLASS class1 DEFINITION ABSTRACT....ENDCLASS.抽象类不能使用CREATE OBJECT 语句创建类对象, 其主要目的是为了做派生类的模板, 实际使用的对象则依照各个派生类创建.也可以将方法定义为抽象方法.METHODS meth ABSTRACT ...一个抽象方法不能在类本身中实现, 而必须在其派生出的非抽象类中实现. 因而含有抽象方法的类必须定义为抽象类.最终类和最终方法.最终类(Final Class), 是不能被继承的类, 其主要意义在于: 设计过程中, 如果一个类有很多级别的派生类, 则其中公有和被保护成员方法, 随意改动该类, 很容易造成派生类中的语法和主义冲突. 因而, 如果不希望在程序中继续对该类进行派生, 则可以定义该类为最终类.CLASS class1 DEFINITION FINAL....ENDCLASS.最终方法是不可以重新定义的方法, 不一定出现在最终类中, 但最终类中的所有方法都是最终方法.METHODS meth ABSTRACT ...六. 接口.1. 接口的定义与实现.Interfaces 即可以保证这些类外部看起来具胡一致性,标准化的接口, 又可以在不同的类内部使用不同的实现方法, 而这个具体实现过程是类外部的用户无需关心的.接口是一个独立结构, 可以在其中定义一些成员并在具体类中实现, 其作用是对类中已经定义的成员进行扩展. 实现接口后,接口将成为类的公有成员, 但类可以自行对接口中的方法以其自身特定形式实现. 这样, 对于用户来说, 不同的类对象包含相同的操作接口(即接口中定义的成员名称), 但程序内部的具体实现则根据类的不同而有所区别. 接口是OOP中除继承之外的另一个主要多态性的实现机制技术.在程序中定义接口.INTERFACE intf.DATA ...CLASS-DATA ...METHOD ......ENDINTERFACE.在接口定义内部可以声明的成员与类中的成员相同, 但无需注明具体的可见性, 因为具体类中实现的所有接口组件均为公有成员. 同时, 接口定义中也只包含成员声明部分, 而具体的实现也将在具体类中进行.实现接口.接口没有自己的实例, 因而也不需要进行方法实现, 其中方法的实现要通过具体的类进行.语法格式如下:CLASS class1 DEFINITION.PUBLIC SECTION....INTERFACES: int1, int2....ENDCLASS.在类定义中, 接口的实现只能出现在公有部分, 接口中定义的所有组件都将被添加为该类的公有成员.接口中的成员通过接口名称+ " ~ " + 成员方式访问. intf~comp.在类的实现部分, 必须包含所有的接口方法实现.CLASS class IMPLEMENTATION....METHOD intf1_imeth1....ENDMETHOD....METHOD intf2_imeth2....ENDMETHOD....ENDCLASS.一个接口可以被任意多个不同的类实现, 该接口中定义的成员集在各个类中名称相同(形成了一个标准接口), 然而各个类中成员的方法的实现方式则可以有差异, 也就形成了多态性. 如果一个类中除接口之外没有定义任何类自身的公有成员方法, 则接口就成了该类中的全部"外部接口".*&---------------------------------------------------------------------**& Report Z_AF_051*&*&---------------------------------------------------------------------*REPORT z_af_051.INTERFACE status. " Define a interfaceMETHODS write.ENDINTERFACE.CLASS counter DEFINITION.PUBLIC SECTION.INTERFACES status.METHODS increment.PRIVATE SECTION.DATA count TYPE i.ENDCLASS.CLASS counter IMPLEMENTATION.METHOD status~write. " 在接口的实现部分以stauts~write 实现.WRITE: / 'Count in counter is ', count.ENDMETHOD.METHOD increment.ADD 1 TO count.ENDMETHOD.ENDCLASS.CLASS bicycle DEFINITION.PUBLIC SECTION.INTERFACES status.METHODS drive.PRIVATE SECTION.DATA speed TYPE i.ENDCLASS.CLASS bicycle IMPLEMENTATION.METHOD status~write.WRITE: / 'Speed of bicycle is', speed.ENDMETHOD.METHOD drive.ADD 10 TO speed.ENDMETHOD.ENDCLASS.DATA: count TYPE REF TO counter,bike TYPE REF TO bicycle,status TYPE REF TO status,status_tab TYPE TABLE OF REF TO status.START-OF-SELECTION.CREATE OBJECT: count, bike.DO 5 TIMES.CALL METHOD: count->increment,bike->drive.ENDDO.APPEND: count TO status_tab,bike TO status_tab.LOOP AT status_tab INTO status.CALL METHOD status->write.ENDLOOP.该例中包含两个完全无关的类bike 和count, 但实现了相同的接口status, 因而这两个类都包含同样的方法write, 该方法是在接口中定义的.接口引用.引用变量是访问ABAP 对象的途径, 与基于类声明的引用变量类似, 也可以基于接口声明引用变量, 即接口引用. 接口引用也是一种对象引用, 对于包含接口的类对象, 除通过类引用访问之外, 还可通过接口引用进行访问. 接口引用可以指向任何实现了该接口的对象.YPTES|DATA iref TYPE REF TO intf.其中intf 是全局或程序中已经定义的接口.通过接口引用访问对象.要访问一个类对象, 必须先声明一个基于该类的引用变量, 如果该类为一个接口的实现, 则可以将该车胎变量赋给一个接口变量, 此时接口引用与类引用指向相同的类对象.假设接口变量名称为inef, 类引用名称为cref, 赋值语法格式如下:iref = cref.使用类引用访问:cref->intf~attr.CALL METHOD cref->intf~meth.使用接口引用访问属性和方法的语法格式如下:iref->attr.CALL METHOD iref->meth.对于接口中定义的静态成员, 如果该成员是常量, 则只能通过接口引用进行访问:intf=>const对于其他静态接口成员, 则可以通过实现该接口的类本身或者类引用进行访问: class=>intf~attr.CALL METHOD class=>intf~meth.在接口引用间赋值.与类引用类似, 可以将接口引用分配给不同的引用变量, 还可以在类引用和接口引用之间相互赋值.假设存在类引用cref 和接口引用iref, iref1 和iref2.iref1 = iref2.系统将进行静态语法检查, 这两个接口必须参照同一个接口声明, 或者iref2 所参照的接口是接口iref1 的一个成员.如果使用形式:iref = cref.则cref 参照的类必须是ABAP 预定义的空类OBJECT.对于所有其他情况, 则必须通过强制赋值语句或者强制赋值运算符"?="进行. MOVE iref to cref.cref ?= iref.在进行强制赋值时, 系统不会出现任何静态语法检查, 但系统将在运行时检查目标对象引用变量是否可以指向源变量引用的对象. 如果允许则进行赋值, 否则将触发可以捕获的运行时错误MOVE_CASE_ERROR.如果将接口引用赋给类引用, 且该类不是参照OBJECT声明,则必须使用强制赋值, 要使赋值过程成功, 接口引用iref所指向的对象中必须与类引用cref参照的类相同.七事件.事件是除去属性, 方法之外的第三类成员. 这三种组件中, 属性用于刻画类对象的状态, 方法用于访问或修改对象状态, 而事件则用于一个类对象发布其状态的改变, 因而其他对象可以捕获该方法并作出响应.在ABAP Object 中, 事件的触发和处理是通过特定的方法进行的, 一个方法作为触发者触发事件, 而程序中的另一个方法则作为处理者捕获并处理该事件, 处理方法在事件出现进被执行.声名事件.事件可以在类或接口的声名部分进行声明.EVENTS|CLASS-EVENTS evtEXPORTING ... VALUE(e1) TYPE type [OPTIONAL] ...声明该事件时, 可以使用EXPORTING 附加项指定需要向事件处理方法中传递的参数, 该参数传递方法恒为值传递. 实例事件总是包含一个隐含的参数SENDER, 该参数的类型为触发事件的类或接口的对象引用.触发事件.一个实例事件可以被类中的任意方法触发, 静态事件则可以被静态方法触发. RAISE EVENT evt EXPORTING ... e1 = f1 ...对于每一个没有被指定OPTIONAL 项的形参ei, 均必须在实例方法中传递一个实参fi, 自身引用ME 对象在被默认的传递到隐含参数SENDER.事件处理方法事件需要通过方法捕获事件并进行处理, 必须首先为该事件定义一个事件处理方法, 然后在运行时为该事件进行注册.声明事件处理方法任何类都可以为其它类中定义的事件进行处理, 同时也可以为自身事件进行处理.实例事件处理方法的语法格式如下:METHODS|CLASS-METHODSmeth FOR EVENT evt OF cif IMPORTING ... ei ...一个事件处理方法的接口中只能包含定义在事件evt 中的形式参数, 并需遵循事件中的参数属性设定, 但事件处理方法不需要使用所有RAISE EVENT 中定义的参数.注册事件处理方法.要使事件处理方法能够对事件进行响应,必须在运行时为相关事件注册该方法, 语法格式如下:SET HANDLER ... hi ... [FOR] ...该语句将处理方法和相关的触发方法进行链接, 其语法和使用效果部分地取决于事件的类型.定义在类中的实例事件.定义在接口中的实例事件.定义在类中的静态事件.定义在接口中的静态事件.对于实例事件, 在进行处理之前必须在注册语句中使用附加项FOR 指定希望注册到的对象.可以指定一个单独的对象作为事件触发者.SET HANDLER ... hi ... FOR ref.或者使用FOR ALL INSTANCES 附加项为处理器注册所有可以触发该事件的实例; SET HANDLER ... hi ... FOR ALL INSTANCES.该注册过程可以作用于目前尚未被创建的实例.对于静态事件, 则不能使用FOR 附加项;SET HANDLER ... hi ...该注册自动应用于整个类, 对于接口中的静态事件, 该注册可以应用于目前尚未装载至内在中的类.事件处理时间.在程序执行到RAISE EVENT 语句之后, 所有已注册的处理方法都将在下一个语句之前被处理. 如果处理方法本身触发事件, 则该处理方法在原方法继续执行之前被重新调用.事件的触发及处理.事件的触发和处理基本过程如下: 假设有两个类C1 和C2, C1中包含事件E1, 而该事件可能在方法M1 中通过RAISE EVENT 语句被触发, 而C2 中将包含方法M2, 该方法可以捕获事件E1, 并进行处理.在实际操作时, 要使一个对象的事件处理方法能够捕获另一个对象触发事件, 必须先使用SET HANDLER 语句进行注册, 这个注册过程中形成了触发对象和响应对象之间的对应关系.当然, 也可以同时注册多个处理对象与一个触发对象相对应.SET HANDLER 语句则创建一个系统内部的事件处理表, 为每一个事件注册相应的方法. 该表为系统隐含. 对于实例事件, 事件处理表中包含用于实现处理的方法名称以及注册了的类实例引用, 该表通过SET HANDLER 语句动态的进行维护. 对于静态事件, 系统为相关类创建一个实例无关的处理表. 一旦事件被触发, 系统将查找相关的事件表并执行对应于该事件的实例方法.*&---------------------------------------------------------------------**& Report Z_AF_052*&*&---------------------------------------------------------------------*REPORT z_af_052.CLASS class1 DEFINITION INHERITING FROM object.PUBLIC SECTION.EVENTS: too_fast. " 声明事件,如果有参数恒为值传递METHODS: accelerate,show_speed.PROTECTED SECTION.DATA: speed TYPE i.ENDCLASS.CLASS class1 IMPLEMENTATION.METHOD accelerate.speed = speed + 1.IF speed > 5.RAISE EVENT too_fast. "触发事件speed = 5.ENDIF.ENDMETHOD.METHOD show_speed.WRITE: / 'Speed:', speed.ENDMETHOD.ENDCLASS.*事件需要通过方法捕获事件并进行处理,必须首先为该事件定义*一个事件处理方法,然后在运行时为该事件进行注册.*声明事件处理方法,任何类都可以为其他类中定义的事件进行处理,*当然也可以为自身事件进行处理.CLASS handler DEFINITION.PUBLIC SECTION.METHODS handle_excess FOR EVENT too_fast OF class1.ENDCLASS.CLASS handler IMPLEMENTATION.METHOD handle_excess.WRITE: / 'Speed can not be too fast.'.ENDMETHOD.ENDCLASS.DATA: o_class1 TYPE REF TO class1,o_handle TYPE REF TO handler.START-OF-SELECTION.CREATE OBJECT: o_class1,o_handle.*要使事件处理方法能够对事件进行响应, 必须在运行时为相关事件注册该方法.SET HANDLER o_handle->handle_excess FOR ALL INSTANCES.DO 11 TIMES.CALL METHOD o_class1->accelerate. CALL METHOD o_class1->show_speed. ENDDO.。

相关文档
最新文档