ABAPObject - ooxxvv/MySAPnotes GitHub Wiki

PageOutline {{{#!comment -------------------- 以上的部份是固定的,不要變動 ----- ---------------------------------------- 在建立連結時,請標明連結的頁面類型,例如:wiki:WikiStart,而不要只用 WikiStart ----- }}}

ABAPObject

  • 目前是存放物件導向程式的相關資料

Other

Source Code

{{{#!abap

REPORT ZHEF_ABAP_OBJECTS_EXAMPLE2.


  • Local classes Example 2
  • Using enheritance
  • Raising and handling events


  • Super class Empolyee

*定義一個父類,只是定義裡面的一些數據類型,

  • 具體的方法和內容在下面實現. CLASS Employee DEFINITION. *定義公共部分的數據和方法 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. ENDCLASS.


  • Subclass Factory Worker
  • The class FactoryWorker is a subclass of the superclass Employee.
  • Note that the attribute iExtraNoUnits have been added and the
  • method CalculatePay has been redefined.

*定義一個子類.從父類中繼承過來 CLASS FactoryWorker DEFINITION INHERITING FROM Employee. PUBLIC SECTION.

  • 定義一個事件. EVENTS/ LazyEmployee.
  • 增加一個屬性 DATA/ iExtraNoUnits type i. *覆蓋父的方法,現在從新定義CalculatePay. METHODS/
  • Redefinition af the CalculatePay method from the Superclass CalculatePay REDEFINITION. ENDCLASS.

*現在實現這個個子類. CLASS FactoryWorker IMPLEMENTATION. METHOD CalculatePay.

  • 重新定義方法 iPay=( iNoOfUnits * iPayPerUnit ) + ( iExtraNoUnits * iPayPerUnit * 2 ).
  • 拋出處理 IF iNoOfUnits < 100. raise event LazyEmployee. ENDIF. ENDMETHOD. ENDCLASS.

  • This class only to show how you can handle an event that have been
  • raised in another class

  • 這個類只能處理一個在其他類中拋出的事件.
  • 被開除的員工的類的定義 CLASS FireEmployee DEFINITION. PUBLIC SECTION.
  • Method for handling the event LazyEmployee in the FactoryWorker
  • subclass.
  • 定義YOUAREFIRED方法為FACTORYWORKER類中的LAZYEMPLOYEE事件. METHODS YouAreFired FOR EVENT LazyEmployee 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. ENDMETHOD. ENDCLASS.

*下面是使用CLASS


  • U S I N G T H E C L A S S E S

DATA/ MyPay TYPE i.

START-OF-SELECTION. *-----------------------------------------------------------------------

  • Using the superclass Employee *-----------------------------------------------------------------------

  • Declare new Employee from the EmployeeClass DATA/ SamSmith TYPE REF TO Employee. CREATE OBJECT/ SamSmith. SamSmith->nEmployeeNo=433. SamSmith->cEmployeeName='Sam Smith'. SamSmith->iNoOfUnits=150. SamSmith->iPayPerUnit=3. MyPay=SamSmith->CalculatePay( ). CALL METHOD SamSmith->WritePay( MyPay ). SKIP. *-----------------------------------------------------------------------

  • Using the subclass FactoryWorker *-----------------------------------------------------------------------

  • Declare new FactoryWorker as subclass of the EmployeeClass DATA/ JessicaJones TYPE REF TO FactoryWorker. CREATE OBJECT/ JessicaJones. 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. 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. LazyJohn->iPayPerUnit=3. WRITE/ / 'Lazy John has produced less than 100 units'. MyPay=LazyJohn->CalculatePay( ).

}}}

{{{#!comment -------------------- 以下的部份是固定的,不要變動 ----- }}}