ABAP 面向对象(Object Orientation) OO
【转自 http://blog.sina.com.cn/s/blog_7c7b16000101bhof.html】
在程序中, 对象的识别和寻址是通过对象引用来实现的, 对象引用变量可以访问对象的属性和方法.
CLASS 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.
CLASS application DEFINITION.
PUBLIC SECTION.
CLASS-DATA class_name(10) type c value
'Vehicle'. "静态属性
PRIVATE SECTION.
DATA speed TYPE i.
ENDCLASS.
代码完成具体的功能.
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.
则整个类库将被载入到程序内存中.
DATA: ob_veh1 TYPE REF TO z_cl_vehicle1.
START-OF-SELECTION.
CREATE OBJECT ob_veh1.
CALL METHOD ob_veh1->show_speed.
对于普通类来说, 应使用类引用.
因而该引用类型变量也就是普通意义上的指向对象的指针.一个引用类型变量可以不指向任何内存地址或指向一个数据对象,
但一个ABAP对象则可以同时存在多个指向它的指针, 可以通过所有这些指针对其进行操作.
vehicle.
实际情况如下图所示:
引用类型与其它类型的数据类型相同, 同类型变量之间也可以相互赋值,
成功赋值之后二者将指向相同的对象.
访问对象组件. -> 即可以访问类中定义的实例组件又可以访问静态组件. 但对于静态组件还有另一种访问方式, 通过类名称本身=>直接访问.
如果一个对象不再被任何变量引用, 则将其删除, 并释放其所占的内存, 这个操作是通过垃圾回收机制来完成的.
[OPTIONAL|DEFAULT def1] ...
...
[OPTIONAL|DEFAULT def1] ...
其中参数定义时用IMPORTING选项指定的形参 i 此时将接受 CALL METHOD 语句中用EXPORTING 中传递的实参 f; 而用
EXPORTING 选项指定的形参 e 此时将通过 IMPORTING 选项传递给实参 g.
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.
其中参数表ptab可以参照类型组ABAP_PARMBID(行类型)和ABAP_PARMBIND_TAB(表类型)生成; 异常表etab
可以参照ABAP_EXCBIND(行类型)和ABAP_EXCBIND_TAB(表类型)生成.
因为函数只返回一个唯一的值. 在ABAP Objects 语法中, 可以用例如函数方法来实现这种函数功能, 形式如下:
[OPTIONAL|DEFAULT def1] ...
PUBLIC SECTION.
METHODS get_area IMPORTING value(i_radius) TYPE i
RETURNING 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.
area TYPE f.
START-OF-SELECTION.
EXPORTING
i_radius = radius
RECEIVING
r_size = area.
WRITE: / area.
area = ob_circle->get_area( radius ).
WRITE: / area.
实例构造方法在每一次对象创建的过程中(CREATE OBJECT语句时)被系统调用, 如果在类声明部分进行声明, 则需要在实现部分进行代码实现.
...
CLASS_CONSTRUCTOR.
* Class Declarations
CLASS 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.
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->accelerate
EXPORTING
rate = 2.
CALL METHOD ob_veh->accelerate
EXPORTING
rate = 2.
CALL METHOD ob_veh->show_speed.
- 一个派生类中的公有成员包括其本身公有部分定义的成员以及所有基类公有成员, 这些公有成员可以通过选择运算符 "->" 在类外部获得.
- 一个派生类中的被保护成员包括其本身被保护部分定义的成员以及所有基类的被保护成员. 这些成员不能通过组件选择运算符 "->" 在类外部获得,
但可以在派生类内部使用. 在类外部看, 其行为与类私有成员完全一致. - 一个派生类中的私有成员只包括其本身私有部分定义的成员. 这些成员只能在派生类内部使用.
参照基类声明的引用变量可以指向其继承类的对象, 如上图所示, 对象 n 是类
Class3的一个实例, 而左侧的三个引用变量 CREF1, CREF2, CREF3 则分别参数类 Class1, Class2, Class3 生成.
这三个类存在继承关系. 参考基类声明的引用变量也可以指向其派生类, 即三个变量均可以指向对象 n, 但要注意的是 CREF1 只能访问 Class1
的公有组件, 而 CREF2 可以访问 Class1 和 Class2的公有组件, CREF3 则可以访问全部类的公有组件.
此时基类中的方法需为实例方法.
*& 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.
Class).
随意改动该类, 很容易造成派生类中的语法和主义冲突. 因而, 如果不希望在程序中继续对该类进行派生, 则可以定义该类为最终类.
而这个具体实现过程是类外部的用户无需关心的.
但类可以自行对接口中的方法以其自身特定形式实现. 这样, 对于用户来说, 不同的类对象包含相同的操作接口(即接口中定义的成员名称),
但程序内部的具体实现则根据类的不同而有所区别. 接口是OOP中除继承之外的另一个主要多态性的实现机制技术.
接口定义中也只包含成员声明部分, 而具体的实现也将在具体类中进行.
也就形成了多态性. 如果一个类中除接口之外没有定义任何类自身的公有成员方法, 则接口就成了该类中的全部"外部接口".
*& Report Z_AF_051
*&
*&---------------------------------------------------------------------*
REPORT z_af_051.
INTERFACE status. " Define a interface
METHODS 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.
该方法是在接口中定义的.
对于包含接口的类对象, 除通过类引用访问之外, 还可通过接口引用进行访问. 接口引用可以指向任何实现了该接口的对象.
此时接口引用与类引用指向相同的类对象.
否则将触发可以捕获的运行时错误 MOVE_CASE_ERROR.
iref所指向的对象中必须与类引用cref参照的类相同.
而事件则用于一个类对象发布其状态的改变, 因而其他对象可以捕获该方法并作出响应.
而程序中的另一个方法则作为处理者捕获并处理该事件, 处理方法在事件出现进被执行.
SENDER, 该参数的类型为触发事件的类或接口的对象引用.
SENDER.
EVENT 中定义的参数.
- 定义在类中的实例事件.
- 定义在接口中的实例事件.
- 定义在类中的静态事件.
- 定义在接口中的静态事件.
则该处理方法在原方法继续执行之前被重新调用.
语句被触发, 而 C2 中将包含方法 M2, 该方法可以捕获事件 E1, 并进行处理.
这个注册过程中形成了触发对象和响应对象之间的对应关系.
事件处理表中包含用于实现处理的方法名称以及注册了的类实例引用, 该表通过 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.
ABAP 面向对象(Object Orientation) OO的更多相关文章
- OO开发思想:面向对象的开发方法(Object oriented,OO)
面向对象的开发方法(Object oriented,OO)认为是好文章吧,拿来分享一下(转载) 面向对象的开发方法(Object oriented,OO) 从事软件开发的工程 师们常常有这样 的体会: ...
- 面向对象(Object Orientation Programming)
Three characteristic of object orientation: Encapsulation: capturing data and keeping it safely and ...
- 理解JAVA - 面向对象(object) - 属性,方法
理解JAVA - 面向对象(object) - 属性,方法 多态的体现: 向上造型,父类接收子类对象:向上造型: 从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...
- Java - 面向对象(object oriented)计划 详细解释
面向对象(object oriented)计划 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24058107 程序包括 ...
- Java面向对象 Object类 内部类
Java面向对象 Object类 内部类 知识概要: 一:Object类 二:内部类 匿名内部类的写法 1.Object O ...
- ABAP 面向对象事件处理
面向对象事件在ABAP中十分重要,并且很容易处理. 我们需要handler方法来注册事件: METHODS : handle_event_raised FOR EVENT event_raised O ...
- 面向对象设计原则OO
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
- 始入OO课程的殿堂,初识面向对象的奥妙——OO第一次博客总结
当我满怀期待叩开OO的大门,却发现宝藏藏在层层阻难之后 第一次作业 1.度量分析 >关于第一次作业的metrics图分析没有出现标红的McCabe Cyclomatic Complexity或者 ...
- Beginning Scala study note(3) Object Orientation in Scala
1. The three principles of OOP are encapsulation(封装性), inheritance(继承性) and polymorphism(多态性). examp ...
随机推荐
- PHP中session详解
SESSION 的数据保存在哪里呢? 当然是在服务器端,但不是保存在内存中,而是保存在文件或数据库中. 默认情况下,PHP.ini 中设置的 SESSION 保存方式是 files(session ...
- python 搭建环境
直接命令行里面 1.进入相应的目录 ,然后python,然后python setup.py 2.或者直接python C:\Python27\Lib\site-packages\xlrd-0.9.3\ ...
- 无法将“Update-Database”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的问题
原因: 没有引用EntityFramework命令 解决: 在程序包管理器控制台执行如下命令:Import-Module 项目路径\packages\EntityFramework.6.1.3(EF版 ...
- swift 中的问号跟感叹号
?: 变量在使用过程中可能存在空值,则需要用?标记,否则赋空值会报错 ? 1 2 var mustNoNilValue: String = "Swift" var canNilVa ...
- Jenkins Docker 插件
原文地址:https://wiki.jenkins.io/display/JENKINS/Docker+Plugin Created by magnayn -, last modified by Ni ...
- [ Laravel 5.6 文档 ]laravel数据库操作分页(自定义分页实现和自定义分页样式)
简介 在其他框架中,分页可能是件非常痛苦的事,Laravel 让这件事变得简单.易于上手.Laravel 的分页器与查询构建器和 Eloquent ORM 集成在一起,并开箱提供方便的.易于使用的.基 ...
- idea 破解转(肉测好用,测试2018.4.16)
首先,打开蓝雨的官网--->http://idea.lanyus.com/,找到这个jar包 之后,去官网下载IDEA--->https://www.jetbrains.com/idea/ ...
- rbg大神的主页
http://www.rossgirshick.info/ Ross Girshick (rbg)Research ScientistFacebook AI Research (FAIR) r...@ ...
- 【边做项目边学Android】小白会遇到的问题--Appcompat_V7问题
问题描写叙述: 首先遇到的问题就是adt版本号的选择,sdk版本号的选择: adt按非小白朋友说的选了最新的ADT-22.3.0,同一时候我也把sdk更新到了最新的(嗯.这个要fanqiang,或者找 ...
- 搭建redis集群遇到的坑
搭建redis集群遇到的坑 #!/bin/bash # 作者: tuhooo # 日期: 2017.4.23 20.15 # 用途: 通过ruby脚本启动redis伪集群 if [ $2 == &qu ...