ABAP OO練習

繼續我們的看實例學習abap面向對象編程.

在此次的例子中,我們以僱員的工資爲藍圖,設計一個程序,然後再一步一步的改進我們寫的程序,使其有更好的擴展性以及維護性.

該例中所使用的基類是employee類,其子類包括:boss類,不管工作多長時間,他總是有固定的週薪(好爽!).銷售員類commission worker,他的收入是一小部分工資加上銷售額的一定提成.計件工類piece worker,他的收入取決於生產的計件數量.

我會列出代碼,基本上是一節一個類,最後是這些類的測試程序.

先給出類圖如下:

**第一節:employee類的實現**

*&---------------------------------------------------------------------*

*& Include ZBOBO_OO_EMPLOYEE_CLASS

*&---------------------------------------------------------------------*

*定義一個基類,該類爲抽象類,不能直接實例化,必須在對象中實例化

CLASS EMPLOYEE DEFINITION ABSTRACT.

PUBLIC SECTION.

METHODS:

*定義構造方法,有兩個參數,分別爲姓,名

CONSTRUCTOR IMPORTING A TYPE STRING

B TYPE STRING,

*定義getter方法,分別得到姓名

GETFIRSTNAME RETURNING VALUE(FI) TYPE STRING,

GETLASTNAME RETURNING VALUE(LA) TYPE STRING,

*定義兩個抽象方法,因爲各種employee的收入結構不同,必須在其子類中

*實例化

EARNINGS ABSTRACT

RETURNING 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 STRING

BOSS_B TYPE STRING

S 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->CONSTRUCTOR

EXPORTING A = BOSS_A

B = 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 DEFINITION

INHERITING FROM EMPLOYEE.

PUBLIC SECTION.

METHODS:

*定義構造函數

CONSTRUCTOR

IMPORTING A TYPE STRING

B TYPE STRING

C TYPE F

D TYPE F

E TYPE I,

*定義setter以及getter方法

SETSALARY

IMPORTING S TYPE F,

GETSALARY

RETURNING VALUE(SA) TYPE F,

SETCOMMISSION

IMPORTING C TYPE F,

SETQUANTITY

IMPORTING 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->CONSTRUCTOR

EXPORTING 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 DEFINITION

INHERITING FROM EMPLOYEE.

PUBLIC SECTION.

METHODS:

*定義構造函數

CONSTRUCTOR

IMPORTING A TYPE STRING

B TYPE STRING

W TYPE F

Q TYPE I,

*setter方法

SETWAGE

IMPORTING W TYPE F,

SETQUANTITY

IMPORTING 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->CONSTRUCTOR

EXPORTING 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_REF

EXPORTING BOSS_A = 'Jhon'

BOSS_B = 'Smith'

S = '800.00'.

*narrowing cast

EM_REF = BO_REF.

*輸出到屏幕

CALL METHOD EM_REF->PRINT.

EARNS = EM_REF->EARNINGS( ).

WRITE: / 'Earned: $',EARNS DECIMALS 2 EXPONENT 0.

*下面的代碼基本上和上面的相同

CREATE OBJECT CO_REF

EXPORTING 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_REF

EXPORTING 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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章