ABAP對象-面向對象(轉)


轉自: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.
 
簡單ABAP對象

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

 

 
對象類型選擇

 

 
類創建對話框

 

 
類屬性定義

 

說明:
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. 
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM