轉自:https://www.jianshu.com/p/f847c8f71438
1 面向對象基礎
不多贅述何為對象與類。簡單回顧一下在面向對象特性。
- 封裝 限定內部資源的可見性
- 多態 相同名稱的方法在不同類中不同的體現
- 繼承 派生類
REPORT z_simple_object.
CLASS application DEFINITION.
PUBLIC SECTION.
METHODS:show_text.
PRIVATE SECTION.
DATA text(100) TYPE c VALUE 'This is my first ABAP Object'.
ENDCLASS.
CLASS application IMPLEMENTATION.
METHOD show_text.
WRITE text.
ENDMETHOD.
ENDCLASS.
DATA ob_app TYPE REF TO application.
START-OF-SELECTION.
CREATE OBJECT ob_app.
CALL METHOD ob_app->show_text.

2 類和對象
ABAP中的類由程序內部的局域類和全局類,其作用范圍不同。但ABAP中的全局類是通過ABAP工作台中的類創建工具Class Bulider開發的,保存在系統類庫程序(Class pool)中,可供所有程序使用;而在程序內部定義的類則一般只應用於本程序,但二者的定義原則和格式是一致的。
1 程序中的類定義
(1)類聲明及實現
ABAP使用CLASS/ENDCLASS語句進行類定義,且由聲明部分和具體實現部分組成。類聲明部分中包含類成員(Component,又稱Member,具體包括類的屬性,方法和事件等)的名稱及說明。
CLASS class DEFINITION. PUBLIC SECTION. ... PROTECTED SECTION. ... PRIVATE SECTION. ... ENDCLASS. CLASS class IMPLEMENTATION. METHOD ... ENDMETHOD. ... ENDCLASS.
(2)成員可見性
類的各個成員都必須在DEFINITION部分進行聲明。在ABAP對象中,共有三種可見性:
- 公共部分(PUBLIC SECTION)中定義的類成員可以被所有對象使用,包括類方法及派生類中定義的方法。
- 受保護部分(PROTECTED SECTION) 中定義的類成員只能被類及其派生類中的方法使用,外部不可見。
- 私有部分(PRIVATE SECTION)中定義的類成員只能被本身的方法所使用。
(3)成員類型
ABAP類中可以定義三種不同類型的成員,分別是屬性,方法和事件。根據生存期的不同,由實例成員和靜態成員之分。
實例成員僅隸屬於一個特定的類實例,即一個對象,而靜態成員則屬於整個類,是所有的類對象共享的內存區域。
- 屬性
對於實例屬性,使用DATA語句定義,語法與數據對象聲明相同;對於靜態屬性,則使用CLASS-DATA語句進行定義。屬性在類的聲明部分進行定義。
CLASS vehicle DEFINITION.
PULIC SECTION.
CLASS-DATA class_name(10) TYPE c VALUE 'Vehicle'.
PROTECTED SECTION.
DATA speed TYPE i.
ENDCLASS.
對於公有組件,可以在屬性定義語句中增加READ-ONLY關鍵字,則該屬性不能被類外部讀取但可被類的內部方法所修改。這種定義方法避免了每次讀取類屬性時都需要分配相應的讀取方法,因為直接獲得類屬性要比通過類方法更為高效。
- 方法
實例方法只能訪問該對象實例中的所有屬性和事件,而靜態方法則只能訪問類的靜態屬性和事件。
類方法需要在類的聲明和實現兩部分進行定義,在類的聲明部分說明方法的參數接口,在類的實現部分則通過ABAP代碼完成具體的功能。方法的聲明關鍵字為METHODS和CLASS-METHODS;實現部分代碼在語句METHOD和ENDMETHOD之間定義。
方法聲明語法如下
METHODS meth
IMPORTING ... i TYPE type ...
EXPORTING... i TYPE type ...
CHANGING ... i TYPE type ...
EXCEPTIONS ... i TYPE type ...
- Importing 用於定義輸入參數
- Exporting 用於定義輸出參數
- Changing 用於定義輸入輸出參數
- Exceptions 用於定義可能出現的異常
在方法實現部分,不需要重復定義這個接口
METHOD meth
...
<ABAP Statement> ... ENDMETHOD.
REPORT z_simple_object.
CLASS vehicle DEFINITION.
PUBLIC SECTION.
CLASS-DATA class_name(10) TYPE c VALUE 'Vehicle'.
METHODS:accelerate,
show_speed.
PROTECTED SECTION.
DATA speed TYPE i.
ENDCLASS.
CLASS vehicle IMPLEMENTATION.
METHOD accelerate.
speed = speed + 1.
ENDMETHOD.
METHOD show_speed.
WRITE: / 'Speed:', speed.
ENDMETHOD.
ENDCLASS.
2 定義系統全局類
可以長期存儲,維護供整個系統調用,並在系統間傳輸。該類型不包含事件塊,子程序,屏幕等元素,也不包含共有數據部分,因為也不能分配事務代碼。
(1)全局類定於




說明:
level(級別,包括靜態屬性Static Attr. 實例屬性Instance Attr. 常量Constant)
Visibility(可見性,PUBLIC,PROTECTED,PRIVATE)
Attributes(屬性),Methods(方法),Parameters(參數接口)
在樹形結構中雙擊方法名稱,可以添加該方法的代碼

(4)使用全局類
REPORT z_global_class. DATA: o_vehicle TYPE REF TO z_cl_vehicle, count TYPE i. START-OF-SELECTION. CREATE OBJECT o_vehicle. DO 5 TIMES. CALL METHOD o_vehicle->accelerate. ENDDO. CALL METHOD o_vehicle->show_speed.

3 程序中的類實例
ABAP類定義之后,並沒有實現任何功能,類似於數據類型定義,實際應用則必須通過類的實例-對象來實現。步驟如下:
1)定義類的聲明與實現方法
2)使用DATA語句中的TYPE REF TO 選項參照類類型聲明引用變量
3)使用CREATE OBJECT語句創建對象
4)通過"->"或"=>"運算符訪問對象或類組件
(1)對象創建與引用
ABAP對象的創建和訪問需要通過對象引用進行。在程序中,需要先根據對象類型聲明引用類型變量,然后對該變量引用ABAP對象,該引用變量中實際存儲的是ABAP對象的內存地址。
(2)訪問對象組件
對象創建后,可以通過指向它的引用變量對其進行操作。可以使用的對象組件一般為當前可見的屬性和方法,通過引用變量后接運算符“->”訪問對象組件。oref->comp
其中,oref代表引用類型變量,comp代表要訪問的類成員。“->”為對象選擇運算符,可以用於訪問類中定義的實例組件和靜態組件。
對於類中的靜態組件而言,還有另外一種訪問方式,可以不通過實例和引用變量進行,而是通過類名稱本身使用類成員選擇運算符“=>”直接對類進行操作。class=>comp
REPORT z_simple_object.
CLASS vehicle DEFINITION.
PUBLIC SECTION.
CLASS-DATA class_name(10) TYPE c VALUE 'Vehicle'.
METHODS:accelerate,
show_speed.
PROTECTED SECTION.
DATA speed TYPE i VALUE 1.
ENDCLASS.
CLASS vehicle IMPLEMENTATION.
METHOD accelerate.
speed = speed + 1.
ENDMETHOD.
METHOD show_speed.
WRITE: / 'Speed:', speed.
ENDMETHOD.
ENDCLASS.
DATA o_vehicle TYPE REF TO vehicle.
START-OF-SELECTION.
WRITE vehicle=>class_name.
CREATE OBJECT o_vehicle.
CALL METHOD o_vehicle->accelerate.
CALL METHOD o_vehicle->show_speed.

由於引用類型變量本身也可以被定義為類屬性,因而可以出現下述的鏈式訪問結構oref1->oref2->comp
或者class=>oref->comp
上述的兩種運算符提供類的外部訪問,在某些情況下,對象本身需要知道自身的地址,可以使用局部引用變量ME,該變量隱式的存在與所有的實例方法中,當方法被調用時,該變量將包含自身的地址指針,這種用法稱為對象的自身引用。
訪問內容 | 語法格式 |
---|---|
一個對象的實例屬性或靜態屬性 | orer->attr |
類的靜態屬性 | class=>attr |
在類內部訪問自身實例屬性或靜態屬性 | me->attr 或 attr |
對象的實例屬性或靜態方法 | CALL METHOD orer -> meth |
類的靜態方法 | CALL METHOD class=>meth |
在類內部訪問自身實例方法或靜態方法 | CALL METHOD me->attr 或 CALL METHOD attr |
(3)刪除對象
對象占據程序內存,如果后續程序不再使用的對象,應該將其刪除。系統對對象的刪除操作與引用變量有關,系統將自動定時檢測,如果一個對象不再被熱任何變量引用,則將其刪除,並釋放其所占用的內存,這個操作就是通過垃圾回收機制完成。
垃圾收集器定時清除不再使用的對象,包括使用鏈式引用的對象,也可以被其檢測刪除。要讓其發揮作用,只需簡單的使用CLEAR語句初始化所有指向該對象的引用變量或者將引用變量的值改變。
REPORT z_simple_object.
CLASS vehicle DEFINITION.
PUBLIC SECTION.
CLASS-DATA class_name(10) TYPE c VALUE 'Vehicle'.
METHODS:accelerate,
show_speed.
PROTECTED SECTION.
DATA speed TYPE i VALUE 1.
ENDCLASS.
CLASS vehicle IMPLEMENTATION.
METHOD accelerate.
speed = speed + 1.
ENDMETHOD.
METHOD show_speed.
WRITE: / 'Speed:', speed.
ENDMETHOD.
ENDCLASS.
DATA: o_vehicle1 TYPE REF TO vehicle,
o_vehicle2 LIKE o_vehicle1.
START-OF-SELECTION.
CREATE OBJECT: o_vehicle1, o_vehicle2.
o_vehicle1 = o_vehicle2.
CLEAR o_vehicle2.
該程序中,當o_vehicle1指向新對象后,先創建的對象將被清除,而程序初始化變量o_vehicle2后,由於o_vehicle1仍指向第二個對象,所以該對象依然處於活動狀態。
3 方法
1 參數的定義和傳遞
類方法的參數接口部分是在類聲明部分通過METHODS語句定義的,而且該接口不需要在類的實現部分再次出現,參數接口的語法如下:
METHODS meth
IMPORTING ... [VALUE(Ii) | Ii] TYPE type [OPTIONAL|DEFAULT defi] ... EXPORTING ... [VALUE(Ii) | Ii] TYPE type [OPTIONAL|DEFAULT defi] ... CHANGING ... [VALUE(Ii) | Ii] TYPE type [OPTIONAL|DEFAULT defi] ... RETURNING VALUE(r) EXCEPTIONS ... Xi ...
- IMPORTING 指定一或多個輸入參數
- EXPORTING 指定一或多個輸出參數
- CHANGING 指定一或多個輸入輸出參數
- VALUE 指定參數傳遞形式,VALUE則為值傳遞,也可使用VALUE中的REFERENCE附加項顯示指定引用傳遞
- TYPE 指定參數傳遞形式,也可使用LIKE參照已經定義好的數據對象類型
- OPTIONAL和DEFAULR 通常情況下,已定義的輸入參數必須在調用時進行傳遞,除非使用OPTIONAL選項指定該參數為可選的,此時程序將使用該參數類型的初始值進行傳遞,或者是使用DEFAULT選項后指定的默認值。
- RETURNING 該選項可以替代IMPORTING和EXPORTING
2 調用方法
在調用方法時,除去指定為可選參數之外,所有的參數都必須傳遞相應的實參值。語法結構如下:
CALL METHOD [oref->|class=>] meth EXPORTING ... Ii = Fi ... IMPORTING ... Ei = Gi ... CHANGING ... Ci = Ci ... RECEIVING r = h EXCEPTIONS ... Xi = RCi ...
該語句格式適用於包括類內部直接調用(不需要操作符),實例調用(oref->)和靜態調用(class=>)三種情況。其中參數定義時用IMPORTING選項指定的形參i此時將接受CALL METHOD語句中的EXPORTING中傳遞的實參f;而用EXPORTING指定的形參e此時將通過IMPORTING選項傳遞給實參g。
方法內部的意外處理與功能模塊相似,異常通過RAISE和MESSAGE RAISE語句觸發,並通過系統字段SY-SUBRC返回相關錯誤代碼。
REPORT z_method_para.
CLASS vehicle DEFINITION.
PUBLIC SECTION.
METHODS: accelerate IMPORTING rate TYPE i,
show_speed.
PRIVATE SECTION.
DATA speed TYPE i VALUE 0.
ENDCLASS.
CLASS vehicle IMPLEMENTATION.
METHOD accelerate.
speed = speed + rate.
ENDMETHOD.
METHOD show_speed.
WRITE: / 'Speed:', speed.
ENDMETHOD.
ENDCLASS.
DATA o_vehicle TYPE REF TO vehicle.
START-OF-SELECTION.
CREATE OBJECT o_vehicle.
CALL METHOD o_vehicle->accelerate EXPORTING rate = 2.
CALL METHOD o_vehicle->accelerate EXPORTING rate = 2.
CALL METHOD o_vehicle->show_speed.

ABAP Objects還提供另一種形式
CALL METHOD [oref->|class=>] meth PARAMETER-TABLE ptab. EXCEPTION-TABLE etab.
其中實參必須在程序中放置在兩個特定類型的內表中,傳遞給方法。其中參數表ptab可以參照類型組ABAP中的ABAP_PARMBIND(行類型)和ABAP_PARMBIND_TAB(表類型)生成;異常表etab可以參照ABAP_EXCBIND(行類型)和ABAP_EXCBIND_TAB(表類型)生成。
3 函數方法
函數也是一種過程模塊其特殊之處是在調用時可以使用操作符(如“=”)來替代過程調用語句,並可作為操作數直接應用於操作語句中。
METHODS meth IMPORTING ... [VALUE(Ii)|Ii] TYPE type [OPTIONAL|DEFAULT def] ... RETURNING VALUE(r).
一個函數方法可以擁有任意數量的輸入參數,但只有一個輸出參數,且輸出參數必須為值傳遞而且需要完全限定其類型。
CALL METHOD [oref->|class=>] meth EXPORTING ... Ii = Fi ... RECEIVING r = h.
REPORT z_functional_method. CLASS circle DEFINITION. PUBLIC SECTION. METHODS get_area IMPORTING VALUE(i_radius) TYPE i RETURNING VALUE(r_size) TYPE f. PRIVATE SECTION. CONSTANTS pi TYPE f VALUE '3.1415926'. ENDCLASS. CLASS circle IMPLEMENTATION. METHOD get_area. r_size = i_radius ** 2 * pi. ENDMETHOD. ENDCLASS. * PARAMETERS radius TYPE i. DATA: o_circle TYPE REF TO circle, area TYPE f. START-OF-SELECTION. CREATE OBJECT o_circle. CALL METHOD o_circle->get_area EXPORTING i_radius = radius RECEIVING r_size = area. WRITE: / area. area = o_circle->get_area( radius ). WRITE: / area.

4 構造方法
構造方法是由運行時環境自動調用的一種方法,用於為對象設定一個初始狀態。構造方法也存在靜態和實例兩種形式。構造方法並不一定需要在類中定義,系統通常會自行生成一個默認的構造方法,將對象狀態設置為初始值。
實例構造方法在每一次對象創建的過程中(即使用CREATE OBJCT語句時)被系統調用,如果在類聲明部分進行聲明,則需要在實現部分進行代碼實現。該方法與一般方法有兩點區別:一是有預定義名稱CONSTRUCTOR;二是該方法必須在共有部分進行聲明。
METHODS constructor IMPORTING ... [VALUE(Ii)|Ii] TYPE type [OPTIONAL|DEFAULT def] ... EXCEPTIONS ... e ...
構造方法中不包含任何形式的輸出參數,其功能只是定義對象狀態,而不是對其進行改變。構造方法在CREATE OBJECT語句中被調用,因此根據實例構造方法的定義,該語句本身也可以包含輸出參數EXPORTING和返回值EXCEPTION選項。如果在對象創建過程中出現異常,則對象被刪除,引用變量設為初始值。
REPORT z_method_constructor. CLASS vehicle DEFINITION. PUBLIC SECTION. METHODS: accelerate IMPORTING rate TYPE i, constructor IMPORTING i_speed TYPE i, show_speed. PRIVATE SECTION. DATA speed TYPE i VALUE 0. ENDCLASS. CLASS vehicle IMPLEMENTATION. METHOD accelerate. speed = speed + rate. ENDMETHOD. METHOD show_speed. WRITE speed. ENDMETHOD. METHOD constructor. speed = i_speed. ENDMETHOD. ENDCLASS. DATA o_vehicle TYPE REF TO vehicle. START-OF-SELECTION. CREATE OBJECT o_vehicle EXPORTING i_speed = 4. CALL METHOD o_vehicle->accelerate EXPORTING rate = 2. CALL METHOD o_vehicle->accelerate EXPORTING rate = 2. CALL METHOD o_vehicle->show_speed.
