ABAP對(duì)象-面向?qū)ο?/h2>

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.
簡(jiǎn)單ABAP對(duì)象

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)全局類定于
SE24

對(duì)象類型選擇

類創(chuàng)建對(duì)話框

類屬性定義

說(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)中雙擊方法名稱,可以添加該方法的代碼


類方法實(shí)現(xiàn)
(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.

訪問(wèn)類組件

由于引用類型變量本身也可以被定義為類屬性,因而可以出現(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.
調(diào)用方法

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.
函數(shù)方法

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.
構(gòu)造方法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容