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 ...
随机推荐
- CMake 从文件路径中提取文件名
FILE(GLOB_RECURSE SRC_FILES "*.c" "*.cc" "*.cpp" "*.h" " ...
- UVA - 434 Matty's Blocks
题意:给你正视和側视图,求最多多少个,最少多少个 思路:贪心的思想.求最少的时候:由于能够想象着移动,尽量让两个视图的重叠.所以我们统计每一个视图不同高度的个数.然后计算.至于的话.就是每次拿正视图的 ...
- JS与原生OC/Swift相互调用总结
代码地址如下:http://www.demodashi.com/demo/12754.html JS-OC-Swift JS和OC/Swift相互调用,主要总结了JS和OC交互的三种方式 1.使用UI ...
- 【Cocosd2d-x CCMenu菜单之二】
菜单项CCMenuItem是一个基类. 子类CCMenuItemFont.CCMenuItemLabel.CCMenuItemSprite.CCMenuItemToggle可增加CCMenu中形成菜单 ...
- VBA小功能集合-判断列内是否有重复值
1.判断列内是否有重复值: Dim arrT As Range Dim rng As Range Set arrT = Range("A:A")'判读A列单元格 For Each ...
- 【整理】mysql中information_schema.tables字段说明
[整理]mysql中information_schema.tables字段说明 2016-05-04 16:47:50| 分类: 默认分类|举报|字号 订阅 下载LOFTER我的照片书 | ...
- 2.JAVA编程思想——一切都是对象
一切都是对象 欢迎转载.转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040221 虽然以C++为基础,但 Java 是一种更纯粹的面 ...
- redis 的安装与启动
1.redis介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis 是一个高性能的key-val ...
- Caused by: java.lang.ClassNotFoundException: Didn't find class "** *** ** **" on path: DexPathList[[zip file "/data/app/*** *** ***-2/base.apk"],nativeLibraryDirectories
Caused by: java.lang.ClassNotFoundException: Didn't find class "** *** ** **" on path: Dex ...
- Redis用LPUSH和RPOP实现消息队列
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ServiceS ...