继续我们的看实例学习abap面向对象编程.
在此次的例子中,我们以雇员的工资为蓝图,设计一个程序,然后再一步一步的改进我们写的程序,使其有更好的扩展性以及维护性.
该例中所使用的基类是employee类,其子类包括:boss类,不管工作多长时间,他总是有固定的周薪(好爽!).销售员类commission worker,他的收入是一小部分工资加上销售额的一定提成.计件工类piece worker,他的收入取决于生产的计件数量.
我会列出代码,基本上是一节一个类,最后是这些类的测试程序.
先给出类图如下:
**第一节:employee类的实现***&---------------------------------------------------------------------**& Include ZBOBO_OO_EMPLOYEE_CLASS*&---------------------------------------------------------------------**定义一个基类,该类为抽象类,不能直接实例化,必须在对象中实例化CLASS EMPLOYEE DEFINITION ABSTRACT.PUBLIC SECTION.METHODS:*定义构造方法,有两个参数,分别为姓,名CONSTRUCTOR IMPORTING A TYPE STRINGB TYPE STRING,*定义getter方法,分别得到姓名GETFIRSTNAME RETURNING VALUE(FI) TYPE STRING,GETLASTNAME RETURNING VALUE(LA) TYPE STRING,*定义两个抽象方法,因为各种employee的收入结构不同,必须在其子类中*实例化EARNINGS ABSTRACTRETURNING VALUE(EARN) TYPE F,PRINT ABSTRACT.PRIVATE SECTION.*定义private变量,该变量不能在子类中使用DATA:FIRST_NAME TYPE STRING,LAST_NAME TYPE STRING.ENDCLASS.*类的实现CLASS EMPLOYEE IMPLEMENTATION.*初始化类METHOD CONSTRUCTOR.FIRST_NAME = A.LAST_NAME = B.ENDMETHOD.*实现两getter方法METHOD GETFIRSTNAME.FI = FIRST_NAME.ENDMETHOD.METHOD GETLASTNAME.LA = LAST_NAME.ENDMETHOD.ENDCLASS.**第二节:boss类的实现***&---------------------------------------------------------------------**& Include ZBOBO_OO_BOSS_CLASS*&---------------------------------------------------------------------**定义boss类,该类从employee中继承CLASS BOSS DEFINITION INHERITING FROM EMPLOYEE.PUBLIC SECTION.METHODS:*定义构造函数,初始化对象CONSTRUCTOR IMPORTING BOSS_A TYPE STRINGBOSS_B TYPE STRINGS TYPE F,*定义boss类的方法(setter方法)SETWEEKLYSALARY IMPORTING WS TYPE F,*实现基类中的抽象方法,因为boss类有自己的工资结构*所以在此部分实现EARNINGS REDEFINITION,PRINT REDEFINITION.PRIVATE SECTION.DATA:WEEKLYSALARY TYPE F.ENDCLASS.CLASS BOSS IMPLEMENTATION.METHOD CONSTRUCTOR.*调用父类的构造函数CALL METHOD SUPER->CONSTRUCTOREXPORTING A = BOSS_AB = BOSS_B.*根据新的传入变量,设置boss类私有实例变量WEEKLYSALARY = S.ENDMETHOD.*setter方法的实现METHOD SETWEEKLYSALARY.WEEKLYSALARY = WS.ENDMETHOD.*定义工资以及输出的实现METHOD EARNINGS.EARN = WEEKLYSALARY.ENDMETHOD.METHOD PRINT.DATA: FIRST TYPE STRING,LAST TYPE STRING.FIRST = GETFIRSTNAME( ).LAST = ME->GETLASTNAME( ).WRITE: / 'Boss name is:',LAST,FIRST.ENDMETHOD.ENDCLASS.**第三节:commission worker类的实现***&---------------------------------------------------------------------**& Include ZBOBO_OO_COMWORKER_CLASS*&---------------------------------------------------------------------**定义commission worker类,他的收入是一小部分基本工资加上销售额的*一定的百分比CLASS COMMISSIONWORKER DEFINITIONINHERITING FROM EMPLOYEE.PUBLIC SECTION.METHODS:*定义构造函数CONSTRUCTORIMPORTING A TYPE STRINGB TYPE STRINGC TYPE FD TYPE FE TYPE I,*定义setter以及getter方法SETSALARYIMPORTING S TYPE F,GETSALARYRETURNING VALUE(SA) TYPE F,SETCOMMISSIONIMPORTING C TYPE F,SETQUANTITYIMPORTING Q TYPE I,*重定义父类的抽象方法EARNINGS REDEFINITION,PRINT REDEFINITION.PRIVATE SECTION.*定义私有实例变量DATA:SALARY TYPE F,COMMISSION TYPE F,QUANTITY TYPE I.ENDCLASS.*实现commission worker类CLASS COMMISSIONWORKER IMPLEMENTATION.METHOD CONSTRUCTOR.CALL METHOD SUPER->CONSTRUCTOREXPORTING A = A B = B.SALARY = C.COMMISSION = D.QUANTITY = E.ENDMETHOD.METHOD SETSALARY.SALARY = S.ENDMETHOD.METHOD GETSALARY.SA = SALARY.ENDMETHOD.METHOD SETCOMMISSION.COMMISSION = C.ENDMETHOD.METHOD SETQUANTITY.QUANTITY = Q.ENDMETHOD.*实现工资的算法METHOD EARNINGS.EARN = SALARY + COMMISSION * QUANTITY.ENDMETHOD.*实现输出方法METHOD PRINT.DATA: FI TYPE STRING,LA TYPE STRING.WRITE: / 'Commission Worker:'.FI = GETFIRSTNAME( ).LA = GETLASTNAME( ).WRITE: FI,LA.ENDMETHOD.ENDCLASS.**第四节:piece worker类的实现***&---------------------------------------------------------------------**& Include ZBOBO_OO_PIWORKER_CLASS*&---------------------------------------------------------------------**定义piece worker类,他的工资取决于他生产的计件数量CLASS PIWORKER DEFINITIONINHERITING FROM EMPLOYEE.PUBLIC SECTION.METHODS:*定义构造函数CONSTRUCTORIMPORTING A TYPE STRINGB TYPE STRINGW TYPE FQ TYPE I,*setter方法SETWAGEIMPORTING W TYPE F,SETQUANTITYIMPORTING Q TYPE I,*实例化抽象方法EARNINGS REDEFINITION,PRINT REDEFINITION.PRIVATE SECTION.DATA:WAGE TYPE F,QUAN TYPE I.ENDCLASS.CLASS PIWORKER IMPLEMENTATION.METHOD CONSTRUCTOR.CALL METHOD SUPER->CONSTRUCTOREXPORTING A = A B = B.WAGE = W.QUAN = Q.ENDMETHOD.METHOD SETWAGE.WAGE = W.ENDMETHOD.METHOD SETQUANTITY.QUAN = Q.ENDMETHOD.*计算工资METHOD EARNINGS.EARN = QUAN * WAGE.ENDMETHOD.*重定义输出方法METHOD PRINT.DATA: FI TYPE STRING,LA TYPE STRING.WRITE: / 'Piece Worker:'.FI = GETFIRSTNAME( ).LA = GETLASTNAME( ).WRITE: FI,LA.ENDMETHOD.ENDCLASS.**第五节:测试程序的实现***&---------------------------------------------------------------------**& Report ZBOBO_OO_SAPLINK_004*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORT ZBOBO_OO_SAPLINK_004.INCLUDE ZBOBO_OO_EMPLOYEE_CLASS.INCLUDE ZBOBO_OO_BOSS_CLASS.INCLUDE ZBOBO_OO_COMWORKER_CLASS.INCLUDE ZBOBO_OO_PIWORKER_CLASS.*定义引用变量DATA:EM_REF TYPE REF TO EMPLOYEE,BO_REF TYPE REF TO BOSS,CO_REF TYPE REF TO COMMISSIONWORKER,PI_REF TYPE REF TO PIWORKER.DATA:EARNS TYPE F.START-OF-SELECTION.*创建boss对象CREATE OBJECT BO_REFEXPORTING BOSS_A = 'Jhon'BOSS_B = 'Smith'S = '800.00'.*narrowing castEM_REF = BO_REF.*输出到屏幕CALL METHOD EM_REF->PRINT.EARNS = EM_REF->EARNINGS( ).WRITE: / 'Earned: $',EARNS DECIMALS 2 EXPONENT 0.*下面的代码基本上和上面的相同CREATE OBJECT CO_REFEXPORTING A = 'Sue'B = 'Jones'C = '800.00'D = '3.0'E = 150.EM_REF = CO_REF.CALL METHOD EM_REF->PRINT.EARNS = EM_REF->EARNINGS( ).WRITE: / 'Earned: $',EARNS DECIMALS 2 EXPONENT 0.CREATE OBJECT PI_REFEXPORTING A = 'BOB'B = 'LEWIS'W = '2.5'Q = 200.EM_REF = PI_REF.CALL METHOD EM_REF->PRINT.EARNS = EM_REF->EARNINGS( ).WRITE: / 'Earned: $',EARNS DECIMALS 2 EXPONENT 0.
转载于:https://blog.51cto.com/13867077/2141978