1 面向?qū)ο蠡A(chǔ)
不多贅述何為對(duì)象與類。簡(jiǎn)單回顧一下在面向?qū)ο筇匦浴?/p>
- 封裝 限定內(nèi)部資源的可見(jiàn)性
- 多態(tài) 相同名稱的方法在不同類中不同的體現(xiàn)
- 繼承 派生類
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 類和對(duì)象
ABAP中的類由程序內(nèi)部的局域類和全局類,其作用范圍不同。但ABAP中的全局類是通過(guò)ABAP工作臺(tái)中的類創(chuàng)建工具Class Bulider開(kāi)發(fā)的,保存在系統(tǒng)類庫(kù)程序(Class pool)中,可供所有程序使用;而在程序內(nèi)部定義的類則一般只應(yīng)用于本程序,但二者的定義原則和格式是一致的。
1 程序中的類定義
(1)類聲明及實(shí)現(xiàn)
ABAP使用CLASS/ENDCLASS語(yǔ)句進(jìn)行類定義,且由聲明部分和具體實(shí)現(xiàn)部分組成。類聲明部分中包含類成員(Component,又稱Member,具體包括類的屬性,方法和事件等)的名稱及說(shuō)明。
CLASS class DEFINITION.
PUBLIC SECTION.
...
PROTECTED SECTION.
...
PRIVATE SECTION.
...
ENDCLASS.
CLASS class IMPLEMENTATION.
METHOD ... ENDMETHOD.
...
ENDCLASS.
(2)成員可見(jiàn)性
類的各個(gè)成員都必須在DEFINITION部分進(jìn)行聲明。在ABAP對(duì)象中,共有三種可見(jiàn)性:
- 公共部分(PUBLIC SECTION)中定義的類成員可以被所有對(duì)象使用,包括類方法及派生類中定義的方法。
- 受保護(hù)部分(PROTECTED SECTION) 中定義的類成員只能被類及其派生類中的方法使用,外部不可見(jiàn)。
- 私有部分(PRIVATE SECTION)中定義的類成員只能被本身的方法所使用。
(3)成員類型
ABAP類中可以定義三種不同類型的成員,分別是屬性,方法和事件。根據(jù)生存期的不同,由實(shí)例成員和靜態(tài)成員之分。
實(shí)例成員僅隸屬于一個(gè)特定的類實(shí)例,即一個(gè)對(duì)象,而靜態(tài)成員則屬于整個(gè)類,是所有的類對(duì)象共享的內(nèi)存區(qū)域。
- 屬性
對(duì)于實(shí)例屬性,使用DATA語(yǔ)句定義,語(yǔ)法與數(shù)據(jù)對(duì)象聲明相同;對(duì)于靜態(tài)屬性,則使用CLASS-DATA語(yǔ)句進(jìn)行定義。屬性在類的聲明部分進(jìn)行定義。
CLASS vehicle DEFINITION.
PULIC SECTION.
CLASS-DATA class_name(10) TYPE c VALUE 'Vehicle'.
PROTECTED SECTION.
DATA speed TYPE i.
ENDCLASS.
對(duì)于公有組件,可以在屬性定義語(yǔ)句中增加READ-ONLY關(guān)鍵字,則該屬性不能被類外部讀取但可被類的內(nèi)部方法所修改。這種定義方法避免了每次讀取類屬性時(shí)都需要分配相應(yīng)的讀取方法,因?yàn)橹苯荧@得類屬性要比通過(guò)類方法更為高效。
- 方法
實(shí)例方法只能訪問(wèn)該對(duì)象實(shí)例中的所有屬性和事件,而靜態(tài)方法則只能訪問(wèn)類的靜態(tài)屬性和事件。
類方法需要在類的聲明和實(shí)現(xiàn)兩部分進(jìn)行定義,在類的聲明部分說(shuō)明方法的參數(shù)接口,在類的實(shí)現(xiàn)部分則通過(guò)ABAP代碼完成具體的功能。方法的聲明關(guān)鍵字為METHODS和CLASS-METHODS;實(shí)現(xiàn)部分代碼在語(yǔ)句METHOD和ENDMETHOD之間定義。
方法聲明語(yǔ)法如下
METHODS meth
IMPORTING ... i TYPE type ...
EXPORTING... i TYPE type ...
CHANGING ... i TYPE type ...
EXCEPTIONS ... i TYPE type ...
- Importing 用于定義輸入?yún)?shù)
- Exporting 用于定義輸出參數(shù)
- Changing 用于定義輸入輸出參數(shù)
- Exceptions 用于定義可能出現(xiàn)的異常
在方法實(shí)現(xiàn)部分,不需要重復(fù)定義這個(gè)接口
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 定義系統(tǒng)全局類
可以長(zhǎng)期存儲(chǔ),維護(hù)供整個(gè)系統(tǒng)調(diào)用,并在系統(tǒng)間傳輸。該類型不包含事件塊,子程序,屏幕等元素,也不包含共有數(shù)據(jù)部分,因?yàn)橐膊荒芊峙涫聞?wù)代碼。
(1)全局類定于




說(shuō)明:
level(級(jí)別,包括靜態(tài)屬性Static Attr. 實(shí)例屬性Instance Attr. 常量Constant)
Visibility(可見(jiàn)性,PUBLIC,PROTECTED,PRIVATE)
Attributes(屬性),Methods(方法),Parameters(參數(shù)接口)
在樹(shù)形結(jié)構(gòu)中雙擊方法名稱,可以添加該方法的代碼

(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 程序中的類實(shí)例
ABAP類定義之后,并沒(méi)有實(shí)現(xiàn)任何功能,類似于數(shù)據(jù)類型定義,實(shí)際應(yīng)用則必須通過(guò)類的實(shí)例-對(duì)象來(lái)實(shí)現(xiàn)。步驟如下:
1)定義類的聲明與實(shí)現(xiàn)方法
2)使用DATA語(yǔ)句中的TYPE REF TO 選項(xiàng)參照類類型聲明引用變量
3)使用CREATE OBJECT語(yǔ)句創(chuàng)建對(duì)象
4)通過(guò)"->"或"=>"運(yùn)算符訪問(wèn)對(duì)象或類組件
(1)對(duì)象創(chuàng)建與引用
ABAP對(duì)象的創(chuàng)建和訪問(wèn)需要通過(guò)對(duì)象引用進(jìn)行。在程序中,需要先根據(jù)對(duì)象類型聲明引用類型變量,然后對(duì)該變量引用ABAP對(duì)象,該引用變量中實(shí)際存儲(chǔ)的是ABAP對(duì)象的內(nèi)存地址。
(2)訪問(wèn)對(duì)象組件
對(duì)象創(chuàng)建后,可以通過(guò)指向它的引用變量對(duì)其進(jìn)行操作。可以使用的對(duì)象組件一般為當(dāng)前可見(jiàn)的屬性和方法,通過(guò)引用變量后接運(yùn)算符“->”訪問(wèn)對(duì)象組件。oref->comp其中,oref代表引用類型變量,comp代表要訪問(wèn)的類成員?!?>”為對(duì)象選擇運(yùn)算符,可以用于訪問(wèn)類中定義的實(shí)例組件和靜態(tài)組件。
對(duì)于類中的靜態(tài)組件而言,還有另外一種訪問(wèn)方式,可以不通過(guò)實(shí)例和引用變量進(jìn)行,而是通過(guò)類名稱本身使用類成員選擇運(yùn)算符“=>”直接對(duì)類進(jìn)行操作。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.

由于引用類型變量本身也可以被定義為類屬性,因而可以出現(xiàn)下述的鏈?zhǔn)皆L問(wèn)結(jié)構(gòu)
oref1->oref2->comp或者class=>oref->comp上述的兩種運(yùn)算符提供類的外部訪問(wèn),在某些情況下,對(duì)象本身需要知道自身的地址,可以使用局部引用變量ME,該變量隱式的存在與所有的實(shí)例方法中,當(dāng)方法被調(diào)用時(shí),該變量將包含自身的地址指針,這種用法稱為對(duì)象的自身引用。
| 訪問(wèn)內(nèi)容 | 語(yǔ)法格式 |
|---|---|
| 一個(gè)對(duì)象的實(shí)例屬性或靜態(tài)屬性 | orer->attr |
| 類的靜態(tài)屬性 | class=>attr |
| 在類內(nèi)部訪問(wèn)自身實(shí)例屬性或靜態(tài)屬性 | me->attr 或 attr |
| 對(duì)象的實(shí)例屬性或靜態(tài)方法 | CALL METHOD orer -> meth |
| 類的靜態(tài)方法 | CALL METHOD class=>meth |
| 在類內(nèi)部訪問(wèn)自身實(shí)例方法或靜態(tài)方法 | CALL METHOD me->attr 或 CALL METHOD attr |
(3)刪除對(duì)象
對(duì)象占據(jù)程序內(nèi)存,如果后續(xù)程序不再使用的對(duì)象,應(yīng)該將其刪除。系統(tǒng)對(duì)對(duì)象的刪除操作與引用變量有關(guān),系統(tǒng)將自動(dòng)定時(shí)檢測(cè),如果一個(gè)對(duì)象不再被熱任何變量引用,則將其刪除,并釋放其所占用的內(nèi)存,這個(gè)操作就是通過(guò)垃圾回收機(jī)制完成。
垃圾收集器定時(shí)清除不再使用的對(duì)象,包括使用鏈?zhǔn)揭玫膶?duì)象,也可以被其檢測(cè)刪除。要讓其發(fā)揮作用,只需簡(jiǎn)單的使用CLEAR語(yǔ)句初始化所有指向該對(duì)象的引用變量或者將引用變量的值改變。
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.
該程序中,當(dāng)o_vehicle1指向新對(duì)象后,先創(chuàng)建的對(duì)象將被清除,而程序初始化變量o_vehicle2后,由于o_vehicle1仍指向第二個(gè)對(duì)象,所以該對(duì)象依然處于活動(dòng)狀態(tài)。
3 方法
1 參數(shù)的定義和傳遞
類方法的參數(shù)接口部分是在類聲明部分通過(guò)METHODS語(yǔ)句定義的,而且該接口不需要在類的實(shí)現(xiàn)部分再次出現(xiàn),參數(shù)接口的語(yǔ)法如下:
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 指定一或多個(gè)輸入?yún)?shù)
- EXPORTING 指定一或多個(gè)輸出參數(shù)
- CHANGING 指定一或多個(gè)輸入輸出參數(shù)
- VALUE 指定參數(shù)傳遞形式,VALUE則為值傳遞,也可使用VALUE中的REFERENCE附加項(xiàng)顯示指定引用傳遞
- TYPE 指定參數(shù)傳遞形式,也可使用LIKE參照已經(jīng)定義好的數(shù)據(jù)對(duì)象類型
- OPTIONAL和DEFAULR 通常情況下,已定義的輸入?yún)?shù)必須在調(diào)用時(shí)進(jìn)行傳遞,除非使用OPTIONAL選項(xiàng)指定該參數(shù)為可選的,此時(shí)程序?qū)⑹褂迷搮?shù)類型的初始值進(jìn)行傳遞,或者是使用DEFAULT選項(xiàng)后指定的默認(rèn)值。
- RETURNING 該選項(xiàng)可以替代IMPORTING和EXPORTING
2 調(diào)用方法
在調(diào)用方法時(shí),除去指定為可選參數(shù)之外,所有的參數(shù)都必須傳遞相應(yīng)的實(shí)參值。語(yǔ)法結(jié)構(gòu)如下:
CALL METHOD [oref->|class=>] meth
EXPORTING ... Ii = Fi ...
IMPORTING ... Ei = Gi ...
CHANGING ... Ci = Ci ...
RECEIVING r = h
EXCEPTIONS ... Xi = RCi ...
該語(yǔ)句格式適用于包括類內(nèi)部直接調(diào)用(不需要操作符),實(shí)例調(diào)用(oref->)和靜態(tài)調(diào)用(class=>)三種情況。其中參數(shù)定義時(shí)用IMPORTING選項(xiàng)指定的形參i此時(shí)將接受CALL METHOD語(yǔ)句中的EXPORTING中傳遞的實(shí)參f;而用EXPORTING指定的形參e此時(shí)將通過(guò)IMPORTING選項(xiàng)傳遞給實(shí)參g。
方法內(nèi)部的意外處理與功能模塊相似,異常通過(guò)RAISE和MESSAGE RAISE語(yǔ)句觸發(fā),并通過(guò)系統(tǒng)字段SY-SUBRC返回相關(guān)錯(cuò)誤代碼。
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.
其中實(shí)參必須在程序中放置在兩個(gè)特定類型的內(nèi)表中,傳遞給方法。其中參數(shù)表ptab可以參照類型組ABAP中的ABAP_PARMBIND(行類型)和ABAP_PARMBIND_TAB(表類型)生成;異常表etab可以參照ABAP_EXCBIND(行類型)和ABAP_EXCBIND_TAB(表類型)生成。
3 函數(shù)方法
函數(shù)也是一種過(guò)程模塊其特殊之處是在調(diào)用時(shí)可以使用操作符(如“=”)來(lái)替代過(guò)程調(diào)用語(yǔ)句,并可作為操作數(shù)直接應(yīng)用于操作語(yǔ)句中。
METHODS meth
IMPORTING ... [VALUE(Ii)|Ii] TYPE type [OPTIONAL|DEFAULT def] ...
RETURNING VALUE(r).
一個(gè)函數(shù)方法可以擁有任意數(shù)量的輸入?yún)?shù),但只有一個(gè)輸出參數(shù),且輸出參數(shù)必須為值傳遞而且需要完全限定其類型。
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 構(gòu)造方法
構(gòu)造方法是由運(yùn)行時(shí)環(huán)境自動(dòng)調(diào)用的一種方法,用于為對(duì)象設(shè)定一個(gè)初始狀態(tài)。構(gòu)造方法也存在靜態(tài)和實(shí)例兩種形式。構(gòu)造方法并不一定需要在類中定義,系統(tǒng)通常會(huì)自行生成一個(gè)默認(rèn)的構(gòu)造方法,將對(duì)象狀態(tài)設(shè)置為初始值。
實(shí)例構(gòu)造方法在每一次對(duì)象創(chuàng)建的過(guò)程中(即使用CREATE OBJCT語(yǔ)句時(shí))被系統(tǒng)調(diào)用,如果在類聲明部分進(jìn)行聲明,則需要在實(shí)現(xiàn)部分進(jìn)行代碼實(shí)現(xiàn)。該方法與一般方法有兩點(diǎn)區(qū)別:一是有預(yù)定義名稱CONSTRUCTOR;二是該方法必須在共有部分進(jìn)行聲明。
METHODS constructor
IMPORTING ... [VALUE(Ii)|Ii] TYPE type [OPTIONAL|DEFAULT def] ...
EXCEPTIONS ... e ...
構(gòu)造方法中不包含任何形式的輸出參數(shù),其功能只是定義對(duì)象狀態(tài),而不是對(duì)其進(jìn)行改變。構(gòu)造方法在CREATE OBJECT語(yǔ)句中被調(diào)用,因此根據(jù)實(shí)例構(gòu)造方法的定義,該語(yǔ)句本身也可以包含輸出參數(shù)EXPORTING和返回值EXCEPTION選項(xiàng)。如果在對(duì)象創(chuàng)建過(guò)程中出現(xiàn)異常,則對(duì)象被刪除,引用變量設(shè)為初始值。
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.
