繼續我們的看實例學習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.