1. 程式人生 > 其它 >ABAP資料型別和資料物件(二)-有效性和可見性,絕對資料型別

ABAP資料型別和資料物件(二)-有效性和可見性,絕對資料型別

有效性和可見性 在ABAP原始碼中宣告性的語句上下文決定了宣告部分的可見性和有效性,在ABAP程式中,有三個上下文,資料型別和資料物件是在上下文中被宣告的:
  • 過程區域性
    • 當過程被執行的時候,過程的區域性資料是有效的,當過程被建立的時候它被建立,當過程退出的時候被刪除。就他們區域性資料和形參來說,過程也能訪問到主程式的全域性資料,方法也能訪問到他們類的元件。
  • 作為類的元件
    • 類的靜態屬性伴隨著ABAP程式內部會話而存在,類的例項屬性關聯到物件的生命週期,類也能訪問到主程式的全域性資料。
  • 主程式全域性
    • 全域性程式資料的存在伴隨著ABAP程式的內部會話。當程式在內部會話中被載入的時候資料被建立,當程式移除的時候資料被從內部會話刪除。ABAP程式通常只能訪問它自己的全域性資料。
說明:
  • 所有的上下文可以訪問到獨立於程式的ABAP資料字典中的型別定義,對於本地宣告,隱藏了同名的全部宣告。
  • 通過本地型別隱藏的全域性型別可以通過指定絕對的型別名字取消,所以動態指定的資料型別,類,或者介面是可能的。
  • 就獨立的上下文可見性而言,宣告在源文字中的位置也起著重要的作用,只有前面宣告的對於後面是可見的,無關上下文。為了允許程式中的順序匹配上下文可見性,程式所有的全域性宣告應該在原始碼開始的時候被指定,在第一個處理塊之前,所有本地的宣告應該被直接指定。
  • ABAP程式所有的在宣告部分宣告的資料對於程式來說是全域性的,另外所有事件塊和對話方塊模組中宣告的資料也是程式的全域性的(除了事件塊AT SELECTION-SCREEN)。而且在不連續的處理塊之間宣告的資料對於程式來說也是全域性的。
絕對型別名稱(ABSOLUTE TYPE NAMES)        相對於它的上下文,ABAP程式語句中型別的名字可以被靜態使用,也就是相對型別名字,就像在有效性和可見性部分描述的,區域性資料型別隱藏了更多的同名全域性資料型別。 對於絕對型別命名,命名的型別是唯一的,一個絕對的型別名字以一個規範路徑組成,比如:
  • \TYPE=name
  • \CLASS=name
  • \INTERFACE=name
  • \PROGRAM=name
  • \CLASS-POOL=name
  • \FUNCTION-POOL=name
  • \TYPE-POOL=name
  • \METHOD=name
  • \FORM=name
  • \FUNCTION=name
說明:
  • 為了給本地資料型別,類,介面建立絕對型別命名,使用它們上下文作為字首,進行元件命名。
  • 使用一個絕對型別命名的規範使得從本地型別隱藏全域性型別變成可能,如果有訪問的必要載入不同的程式到當前內部會話也是可能的。
  • 執行時型別服務(RTTS)的類型別,比如CL_ABAP_TYPEDESCR,包含了返回絕資料型別或者資料物件的型別名字。
例如:當類c1方法m1和m2被呼叫,RTTS獲取到絕對型別名字\TYPE=SPFLI或者\PROGRAM=RTTI_TEST\CLASS=C1\METHOD=M2\TYPE=SPFLI給泛化型別引數p,在方法m1,m2中spfli的使用含有不同的含義。 程式碼如下:
CLASS c1 DEFINITION.
  PUBLIC SECTION.
    METHODS: m1,
             m2,
             m3 IMPORTING p TYPE any.
ENDCLASS.
CLASS c1 IMPLEMENTATION.
  METHOD m1.
    DATA struc TYPE spfli.
    m3( struc ).
  ENDMETHOD.
  METHOD m2.
    TYPES spfli TYPE spfli.
    DATA struc TYPE spfli.
    m3( struc ).
  ENDMETHOD.
  METHOD m3.
    DATA type_descr TYPE REF TO cl_abap_typedescr.
    type_descr = cl_abap_typedescr=>describe_by_data( p ).
    WRITE / type_descr->absolute_name.
  ENDMETHOD.
ENDCLASS.
 
START-OF-SELECTION.

data c1_ref type REF TO c1.
CREATE OBJECT c1_ref .
c1_ref->m1( ).
c1_ref->m2( ).

執行結果:

\TYPE=SPFLI \PROGRAM=ZWSPTEST10\CLASS=C1\METHOD=M2\TYPE=SPFLI