您好,欢迎来到纷纭教育。
搜索
您的当前位置:首页ABAP OO ??

ABAP OO ??

来源:纷纭教育
ABAP OO 扫盲!面向过程转面向对象的同志们过来一起研究 2009年04月22日 星期三 下午 04:31

教程一大堆,以前也看不懂,我不是计算机专业出身,出来就做OP,所以一直没理解OO的精髓,因为昨天出了点小意外,因为我不会OO,所以遭遇到挫折,今天盛怒下甘瞪了一天,总算是瞪懂了。。。

现在拿我自己看的例子来说下,希望能指导到只懂OP的兄弟。 用代码来说最简单了。

CLASS Employee DEFINITION. 定义一个CLASS,这个东西叫类,就是一类人,一类东西的类,相当于我们的函数,谁都可以去用,谁都可以拿出来在各种场合折腾。就拿这个EMPLOYEE里说,其实就是定义了一类被雇佣的人 *定义公共部分的数据和方法

PUBLIC SECTION. 这个地方分三部分,一个是公共部分,一个是私有部分,一个是保护部分,等下我们说 DATA:

nEmployeeNo(4) type n, “雇员员工号 cEmployeeName(30) type c, “雇员姓名

iNoOfUnits type i, “生产的的单元的数量 iPayPerUnit type i. “每个单元的价格

被雇佣的人总要有身份工号等特征吧,每个员工都有的东西被定义在这里 *定义两个方法,一个是输出,一个是输入 METHODS:

CalculatePay RETURNING VALUE(iPay) TYPE i, 我们所有被雇佣的员工都要一个计算薪水的方法吧

WritePay IMPORTING VALUE(iPay) TYPE i. 我们所有被雇佣的员工每个月都要知道薪水是多少吧

在定义方法的部分里,这段只是定义了需要哪些方法,具体方法里面的内容我们在接下来类的实现中才会具体去设计代码流程。 ENDCLASS.

*这里是具体的类的实现的 CLASS Employee IMPLEMENTATION. *实现上面的方法 METHOD CalculatePay.

iPay = iNoOfUnits * iPayPerUnit. 原来员工计算薪资的方法是数量*每件的金额 ENDMETHOD. METHOD WritePay.

WRITE: / 'The pay for employee ', nEmployeeNo, cEmployeeName, ' is : ', iPay.

ENDMETHOD. 通过这里我们知道了原来员工薪水就是把这几个参数WRITE出来 ENDCLASS.

好了。OO最经典的地方到来了。我们定义了所有被雇佣的员工,但是在现实生活中,我们要写一个员工管理的程序的话,光这样定义一个员工是不够的,有些人很懒,经常迟到,有些人很勤快,经常超额工作。我们不能只简单的拿他一个月做的件数*金额。我们要根据实际情况来分配奖金扣工资等,于是我们想到了在多做几个类,但是重写很麻烦,有些是他们共有的特性,只有部分不同,所以我们要从之前定义的类里把那些定义好的东西拿来继续用,就叫继承 定义一个子类.从父类中继承过来

CLASS FactoryWorker DEFINITION INHERITING FROM Employee.

( INHERITING FROM EMPLOYEE后,这个FACTORYWORKER就具有了EMPLOYEE的公共区域和保护区域的所有内容,但是不具有私有属性里的内容 ) PUBLIC SECTION. * 定义个事件.

EVENTS: LazyEmployee. 事件,类似于OP中的CASE ,FUNCTION中的EVENT,

反正出事了就RAISE 起来 * 增加一个属性

DATA: iExtraNoUnits type i. 给员工增加了。每天超额完成任务后会有的数量

*覆盖父的方法,现在从新定义CalculatePay. METHODS:

* Redefinition af the CalculatePay method from the Superclass CalculatePay REDEFINITION. 这个CALCULATEPAY,从继承过来的EMPLOYEE里是有的,但是有些地方我不太喜欢,我想重新做点修改,这就是REDEFINITION的作用至于修改内容也是在底下的IMPLEMENTATION中体现。 ENDCLASS.

*现在实现这个个子类.

CLASS FactoryWorker IMPLEMENTATION.

METHOD CalculatePay. 在这里我们重新定义下工资计算的方法 * 从新定义方法

iPay = ( iNoOfUnits * iPayPerUnit ) +

( iExtraNoUnits * iPayPerUnit * 2 ). 哦。原来改了,加入了额外工作计件的工资,哈啊哈,还是原来的单件工资的两倍哦~~ * 抛出处理

IF iNoOfUnits < 100. 这里又增加了个条件,当每个月的完工数小于100时,可要惩罚的,否则老板赔本了

raise event LazyEmployee. 这个事件发生了 ENDIF. ENDMETHOD.

ENDCLASS.

接下来我们在继续继承EMPLOYEE来做个类,刚才的类是用来定义一类被雇佣的人--工厂里被雇佣的人,而这个则是定义另一类被雇佣的人--被炒鱿鱼的人。 CLASS FireEmployee DEFINITION. PUBLIC SECTION.

* Method for handling the event LazyEmployee in the FactoryWorker * subclass.

* 定义YOUAREFIRED方法为FACTORYWORKER类中的LAZYEMPLOYEE事件. METHODS YouAreFired

FOR EVENT LazyEmployee 这段写的很明白哦~~这个方法只有在之前的EVENT 发生时才会有用哦 OF FactoryWorker. ENDCLASS.

*来实现这个CLASS吧

* 然后实现具体的方法,就是输出一句话,具体处理. CLASS FireEmployee IMPLEMENTATION. METHOD YouAreFired.

WRITE:/ 'You lazy worker, you have produced less than 100 units.' color col_heading,

'YOU ARE FIRED !!!' color col_negative intensified. 这里我们定义了那个在EVENT发生时候才会触发的方法。。无情的说你被炒掉了,因为你每个月没做够100件。。 ENDMETHOD. ENDCLASS.

之前我们做的工作就相当于在OP中定义FORM一样,不同之处就是这些东西就

像从一个FORM复制过来稍加修改就成了另外一个FORM,并且FORM里有好多小FORM一样。。总之很灵活。

下面我们在程序逻辑中使用使用。哈哈 START-OF-SELECTION.

*-----------------------------------------------------------------------

* Using the superclass Employee

*-----------------------------------------------------------------------

* Declare new Employee from the EmployeeClass

DATA: SamSmith TYPE REF TO Employee. REF TO 这就是说 EMPLOYEE里的变量方法等全部指派给SAMSMITH这个哥们了。他具备着雇员所有应该会出现的功能

CREATE OBJECT: SamSmith. 创建对象,我们要使用这个哥们来计算他的薪水了

SamSmith->nEmployeeNo = 433.

SamSmith->cEmployeeName = 'Sam Smith'. SamSmith->iNoOfUnits = 150.

SamSmith->iPayPerUnit = 3. 基本信息赋值,类似于给FORM传变量数值

MyPay = SamSmith->CalculatePay( ). 用计算工资的方法把工资算出来赋值给MYPAY!

CALL METHOD SamSmith->WritePay( MyPay ). 然后按照MYPAY的内容显示出来SMITH同志的工资 SKIP.

*-----------------------------------------------------------------------

* Using the subclass FactoryWorker

*-----------------------------------------------------------------------

* Declare new FactoryWorker as subclass of the EmployeeClass DATA: JessicaJones TYPE REF TO FactoryWorker.

CREATE OBJECT: JessicaJones.继续来看JESSICAJNES 他引用的是工厂中的雇员,有额外工资,也有可能被炒掉哦。

JessicaJones->nEmployeeNo = 1500.

JessicaJones->cEmployeeName = 'Jessica Jones'. JessicaJones->iNoOfUnits = 300.

JessicaJones->iExtraNoUnits = 500. “子类中额外的一些单元 哇塞,每天多做这多

JessicaJones->iPayPerUnit = 3.

MyPay = JessicaJones->CalculatePay( ). 同样是计算工资 CALL METHOD JessicaJones->WritePay( MyPay ). 显示他的工资 SKIP.

* 以下是处理一个事件所写的例子,上面的两个,一个用到父类,一个用到了子类.

* 现在是用到事件处理的例子.

*-----------------------------------------------------------------------

* Using the subclass FactoryWorker with event

*-----------------------------------------------------------------------

*定义个员工实例 *再定义个处理事件的对象

DATA: LazyJohn TYPE REF TO FactoryWorker, FireHim TYPE REF TO FireEmployee.

这里我们建立的对象貌似是要被炒掉的哦。他的功能里包含了工厂工人的制度FACTORYWORKER,也包括了被炒掉的制度FIREEMPLOYEE。 CREATE OBJECT: LazyJohn, FireHim.

* The SET HANDLER statement, registers a runtime trigger.

* It links a list of handler methods to corresponding event triggers * Each SET HANDLER statement creates an entry in an event handler table * 为LAZYJOHN设置一个处理HANDLER ,具体的方法是 SET HANDLER FireHim->YouAreFired FOR LazyJohn. LazyJohn->nEmployeeNo = 1500.

LazyJohn->cEmployeeName = 'Lazy John'.

LazyJohn->iNoOfUnits = 90. 哎呀真的好少好少

LazyJohn->iExtraNoUnits = 500. 这里绝对是BUG,每天都做不够,额外还做那多

LazyJohn->iPayPerUnit = 3.

MyPay = LazyJohn->CalculatePay( ). 同样在显示工资在MYPAY中 但是在这里肯定会在中间就触发EVENT FIRE的。然后可怜的哥们被FIRE了。 自己COPY这些代码去做做结果吧,懒鬼们。

这是我自己对OO的理解,基本理解了。SE24里有好多GLOBAL CLASS,好多用起来很不错,可以去玩玩看各位。

我自己很菜鸟,所以这些东西也很菜鸟,但是我是很认真很细致的给其他OP转OO苦苦挣扎的非计算机专业ABAP用的,高手就不用来看了。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- fenyunshixun.cn 版权所有 湘ICP备2023022495号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务