1. 程式人生 > >【OO】全面理解 ABAP Object Step by Step (一)

【OO】全面理解 ABAP Object Step by Step (一)

1,傳統的ABAP開發:

ABAP 執行環境

報表開發的模組化:

REPORT ZXXXX.
全域性變數定義.
內表/工作區定義.
SELETION-SCREEN定義.
INITIALIZATION.
初期化操作.
AT SELECTION-SCREEN.
螢幕事件觸發.
START-OF-SELECTION.
主程式流程
END-OF-SELECTION.
結束流程

處理模組(Processing blocks)

1.EVENT blocks
程式構造事件 load-of-program
報表事件 Initialization/start-of-seletion/Get
table/End-of-selection
選擇螢幕事件 At selection-screen
清單事件 Top-of-page/End-of-page/At line-
selection/At user-command
螢幕事件 Process before output/process after input
process on help-request /process on value-requset
2.對話模組(Dialog modules)
Modules.
Endmodules.
3.Procedures
From/function/method

ABAP Runtime Environment告訴我們,程式實際上是從一個處理模組跳入到另一個處理模快中去,直到程式被終止或自行結束。

2,OO:

面向物件執行環境:

面向物件實際上是在面向過程的程式中新增的類似於處理模組的語言成分(CLASS)同時在其他處理模組中使用它.

面向物件的程式相對於面向過程的開發的優勢:
1.一個好的程式結構
ABAP OO具有更加清晰的語法和語義規則
2.讓程式更貼近生活實體
一個物體有什麼用處,有什麼屬性都能通過一個類來表現出來
3.資料的訪問更加安全可靠
public/protect/private訪問關鍵字的設定
4.實現了資料的封裝和抽象
5.提高程式碼的重用性
一個類可以生成多個物件,每個物件都能實現類的所有功能

3,Abap object 的簡單定義和實現

Class 的含義
CLASS是一系列的具有相同結構和行為的物件的集合.因此類就象一個藍圖,該類中建立的物件都保持一致.換個角度思考,類是面向物件開發的基礎, Class 是為了物件而建立的
模板(template),也可以說它就是物件的定義型別.
定義資料:
DATA ABC TYPE CHAR15.

定義內表:

TYPES : BEGIN OF TYXYZ,

…..

END OF TYXYZ.

DATA ITXYZ TYPE TABLE OF TYXYZ.

定義物件

CLASS CL_XYZ DEFINITION.

……..

ENDCLASS.

CLASS CL_XYZ IMPLEMENTATION.

……..

ENDCLASS.

DATA OBJ_XYZ  TYPE REF TO CL_XYZ.

CLASS的包含:
在class的定義部分定義類的元件,元件大體包括3種: 屬性,方法,事件,只有方法在實現部分實現.

ABAP Object 定義:

CLASS C1 DEFINITION.

PUBLIC SECTION.

DATA: A1…
METHODS: M1….
EVENTS: E1….
PROTECTED SECTION.
DATA:A2…
METHODS:M2..
EVENT:E2…
PRIBATE SECTIONS.
DATA:A3..
METHODS: M3…
EVENT:E3.
ENDCLASS.

 實現部分:

CLASS C1 PLEMENTATION.

METHOD M1.
…….
ENDMETHODS.
METHOD M2.
…….
ENDMETHODS.
METHOD M3.
…….
ENDMETHODS..
ENDCLASS.

CLASS元件(靜態和動態)

宣告動態元件的關鍵字:
DATA
動態的屬性
METHODS
動態的方法
EVENTS
動態的事件

a.動態的元件是存在於類的物件中,使用時採用‘->’.
物件->動態的元件    obj_name->xyz

宣告靜態元件的關鍵字:
CLASS-DATA
靜態的屬性
CLASS-METHODS
靜態的方法
CLASS-EVENTS
靜態的事件
CONSTANTS
常量

b.靜態的元件是隻存在於類中,能夠被類的物件使用 ,使用時採用‘=>’的方式.
類=>靜態的元件class_name=>xyz
                            obj_name=>xyz
類的各個物件例項共享它們的靜態屬性!!

類的所有元件必須取決於它的可用範圍.可用範圍包括:公有範圍(public),保護範圍(protect)
和私有範圍(private)

構造器CONSTRUCTOR

A.每個類只有一個構造器
B.執行時在CREATE OBJECT 語句中自動呼叫構造器
C.必須在PUBLIC SECTION 中定義和應用構造器

  • Constructor is the same name of the class.
  • No return value.
  • With in static method we can only access class attributes.
  • Class-constructor does not have any parameters.
  • Constructor has only import parameters

另一個的方法名稱:
CLASS-METHODS CLASS_CONSTRUCTOR.
當類第一次被訪問的時候,這個靜態方法會被直接呼叫,這個方法必須宣告在PUBIC塊中,
在IMPLEMENTATION中實現。

什麼情況下使用構造器

需要分配(外部)資源
需要初始化一些不能用DATA 語句的VALUE 指定的屬性值
需要修改靜態屬性
通常不能顯式的呼叫構造器

物件及物件的引用(object and object reference)

1.宣告一個引用變數 ov1.
DATA: OV1 TYPE REF TO CLASS_NAME.
2.建立這個物件,並把物件授權給引用變數.
CREATE OBJECT OV1.
3.使用物件的元件.
WRITE / oref-> int. “讀物件屬性
CALL METHOD oref-> display_int “呼叫物件方法

類的自我引用(SELF-REFERENCE)

如果一個物件想提供一個它自己的引用,如給另一個物件使用的時候,能夠使用本地的引用關鍵字”ME”.“ME”是預先定義好的,它總是包含當前物件的地址的引用,如下面例子最終輸出:

CLASS c1 DEFINITION.
PUBLIC SECTION.
DATA: int TYPE I VALUE ’10’.
METHODS display_int.
ENDCLASS.
CLASS c1 IMPLEMENTATION.
METHOD display_int.
DATA : int TYPE I VALUE ’20’.
WRITE:/ int,
ME->int.
ENDMETHOD.
ENDCLASS.
DATA : oref TYPE REF TO c1.
CREATE OBJECT oref.
CALL METHOD oref-> display_int.

類的訪問方式:

指標內表(Pointer tables),用來存放相同類建立的物件.

DATA: oref TYPE REF TO c1,
oref_tab TYPE TABLE OF REF TO c1.
START-OF-SELECTION.

DO 3 TIMES.
CREATE OBJECT oref.
APPEND oref TO oref_tab.
ENDDO.

LOOP AT oref_tab INTO oref.
CALL METHOD oref->meth.
ENDLOOP.

方法的使用

1.METHODS的引數介面
METHODS meth1
IMPORTING VALUE(i1) / i1 TYPE type / LIKE dobj DEFAULT def1
EXPORTING VALUE(e1) / e1 TYPE type / LIKE dobj
CHANGING VALUE(c1)/ c1 TYPE type /LIKE dobj DEFAULT def2
EXCEPTIONS x1

2.METHODS的呼叫
CALL METHODS oref1 ->meth1
[ EXPOTING i1 = a1…….in = an ]
[ IMPOTING e1 = a1…….en = an ]
[ CHANGING c1 = a1…….cn = an ]
[ EXCEPTION x1 = r1 …. Other = rn]
a1到an為實際引數

方法的呼叫:

當方法沒有輸出引數(EXPORTING)的時候可以通過以下方式呼叫:
CALL METHOD meth(). “ 沒有輸入引數
CALL METHOD meth( a ). “ 一個輸入
CALL METHOD meth( f1 = a1………fn = an ) . “N個輸入

Function Methods的應用:
我們想象函式呼叫一樣使用方法,可以定義一個方法如下:
METHODS meth
IMPORTING VALUE(i1)/i1 TYPE type/LIKE dobj
[OPTIONAL/DEFAULT def1]
RETURNING VALUE(R) TYPE type /LIKE dobj
一個功能方法(Function Methods)有一堆IMPORING引數和一個RETURNING引數,並且
RETURNING的值必須是VALUE傳遞,同時必須被定義TYPE或LIKE.
CALL METHOD oref->meth
EXPORTING i1 = a1…..in = an
RETURNING R = A.
呼叫格式:
oref-> meth(). “ 沒有輸入引數
oref-> meth( a ). “ 一個輸入
oref-> meth( f1 = a1………fn = an ) . “N個輸入。

4,例項:

Create a vehicle class

建立一個類  ZCL_VEHICLE_XX . 這個類下面屬性SPEED 和 MAX_SPEED表示VEHICLE 的速度和最大速度。以及有SPEED_UP, STOP, 和 SHOW三個方法。

方法 SPEED_UP 有 IMPORTING parameter STEP. 表示加速的程度,但不能超過最大速度。方法STOP則表示使速度為零。方法WRITE用來輸出當前速度和最大速度。

/SE80:
回車,滑鼠右鍵建立:

彈出視窗,填入相應資訊:

注意此時Final不能勾選。 儲存:

按照如下要求構建類:

PUBLIC SECTION.
METHODS constructor.
METHODS speed_up
IMPORTING
step TYPE i.
METHODS stop.
METHODS show.
PROTECTED SECTION.
DATA: speed TYPE i,
max_speed TYPE i VALUE 50.
PRIVATE SECTION.
DATA id TYPE i .
CLASS-DATA object_count TYPE i.

METHOD constructor.
object_count = object_count + 1.
id = object_count.
ENDMETHOD.
METHOD show.
data msg type string.
data: temp_id type string,
temp_speed type string,
temp_max_speed type string.

temp_id = id.
temp_speed = speed.
temp_max_speed = max_speed.

concatenate ’Vehicle’ temp_ID ’,Speed = ’ temp_speed ’,max_speed = ’  temp_max_speed ’.’
into msg.
message msg type ’I’.
ENDMETHOD.
METHOD speed_up.
speed = speed + step.
IF speed > max_speed.
speed = max_speed.
ENDIF.
ENDMETHOD.
METHOD stop.
speed = 0.
ENDMETHOD.

啟用後,例項化ZCL_VEHICLE_XX。

Create an application class : ZCL_APPLICATION_XX。

右鍵放置classes上選擇create:

填入相應資訊儲存:

按照如下資訊構建classes:

PUBLIC SECTION.
CLASS-METHODS start.
PROTECTED SECTION.
PRIVATE SECTION.

METHOD start.
DATA vehicle TYPE REF TO zcl_vehicle_xx.
DATA vehicle_tab LIKE TABLE OF vehicle.
DATA tabindex TYPE i.
DO 10 TIMES.
CREATE OBJECT vehicle.
APPEND vehicle TO vehicle_tab.
ENDDO.
LOOP AT vehicle_tab INTO vehicle.
tabindex = sy-tabix * 10.
vehicle->speed_up( tabindex ).
vehicle->show( ).
ENDLOOP.
ENDMETHOD.

構建好了如下:

F8執行程式:

OVER。