![]() 實例屬性 靜態(tài)屬性 ![]() 組件 ![]() 訪問區(qū)域;權(quán)限 聲明項目時,要注意聲明訪問區(qū)域 ![]() 訪問實力對象,需要首先聲明一個對象。 DATA 名 TYPE REF TO 類。 訪問實例屬性格式 對象->屬性名稱 ![]() 調(diào)用方法,如下 ![]() 類中定義的變量也可以修改 ![]() 一個類可以有多個實例,多個實例之間相對獨立,一個實例修改了值,不會影響其他實例的值。 ![]() 在類中(definition)靜態(tài)屬性聲明 ![]() ![]() 在類中(implementation)靜態(tài)方法實現(xiàn) ![]() 靜態(tài)屬性的訪問,不依附對象,直接通過類=>訪問 ![]() 靜態(tài)方法的訪問 ![]() ![]() Class構(gòu)成要素 ·構(gòu)成要素的分類 –實例組件(Instance-specific component) ·參照類創(chuàng)建對象時,內(nèi)存中存在的項目,每次創(chuàng)建對象時都會被初始化。各個類的對象中都存在 ·聲明方式:屬性:DATA;方法:METHODS。訪問:OBJECT->COMP –靜態(tài)組件(Static component) ·遇到創(chuàng)建類的語句(CREATE OBJECT)開始,直到程序結(jié)束都存儲于內(nèi)存中,是依賴類存在的項目。即使不創(chuàng)建對象,若已存在與內(nèi)存中即可以直接使用。 ·聲明方式:屬性:CLASS-DATA;方法:CLASS-METHODS。訪問:CLASS=>COMP ·類的所有要素在聲明部分實現(xiàn)(Class Definition) –屬性(Attributes) ·可以擁有ABAP所有數(shù)據(jù)類型的類內(nèi)部數(shù)據(jù)字段,對象狀態(tài)由屬性決定。DATA/CONSTANTS –方法(Method) ·用來定義決定對象行為的類內(nèi)部執(zhí)行步驟,可以訪問類的所有屬性,切可通過方法修改對象的內(nèi)容,另外,方法提供傳入傳出參數(shù),便于用戶交互 –事件(Event) ·事件是沒有繼承關(guān)系的類之間可以互相調(diào)用彼此方法的特殊方法 ![]() 對象 ·對象指的是類的實例,每個對象都有自己固有的屬性。 ·一個類可以創(chuàng)建多個對象。 ·在ABAP程序中要訪問對象,需要使用參照對象(Object Reference),參照對象始終存在于參照對象變量中 –DATA obj TYPE REF TO class. 方法 ·方法定義的基本語法 –METHOD IMPORTING …TYPE…. EXPORTING…TYPE… CHANGING …TYPE… EXCEPTIONS … X1… –CALL METHOD [oref->|class=>]meth EXPORTING … i1 = f1… RECEIVING R = h . –IMPORT/EXPORT:數(shù)據(jù)輸入/輸出接口,接口參數(shù)可以參考單個變量,結(jié)構(gòu),或者內(nèi)表 –CHANGING:同時作為輸入輸出接口,接口參數(shù)可以參考單個變量,結(jié)構(gòu),或者內(nèi)表 –RETURNING:返回類傳遞數(shù)值。該定義不能喝CHANGING/EXPORTING同時使用 –EXCEPTIONS:返回執(zhí)行中所出現(xiàn)的錯誤 ·類函數(shù)可以擁有多個輸入?yún)?shù),但只能有一個輸出參數(shù)。類的輸出接口參數(shù)必須與類函數(shù)中所定義類型保持一致 方法的調(diào)用 ·當方法沒有輸出參數(shù)(EXPORTING)的時候可以通過以下方式調(diào)用: –CALL METHOD meth(). “ 沒有輸入?yún)?shù) –CALL METHOD meth( a ). “ 一個輸入 –CALL METHOD meth( f1 = a1………fn = an ) . “N個輸入 類的繼承 ![]() CLASS LCL_SUB DEFINITION INHERITING FROM LCL_COOMPT."類的繼承 ENDCLASS. 子類LCL_SUB中沒有任何數(shù)據(jù);都是繼承來自父類LCL_COMPT。 ![]() 子類可以繼承 publicsection,protectedsection的內(nèi)容 privatesection的內(nèi)容不可以被繼承。 ![]() 方法中參數(shù)的使用 定義:一個函數(shù)導入?yún)?shù) 一個函數(shù)傳出參數(shù) ![]() 實現(xiàn)(gv_change在這里知識起到一個橋梁的的作用) ![]() 帶參函數(shù)的調(diào)用 ![]() 多個參數(shù)的函數(shù)調(diào)用 ![]() ![]() ![]() 返回類傳遞數(shù)值 即返回值 切 只有一個 ![]() 定義 ![]() 實現(xiàn) ![]() 調(diào)用 ![]() 常量 隨意用什么訪問 類=>常量名 或者 對象->常量名 進行 訪問 ![]() ![]() 訪問常量 returning調(diào)用的特點 ![]() ![]() ![]() 異常 ![]() ![]() ![]() 構(gòu)造方法 使用 METHODS CONSTRUCTOR . 每個類只能有一個構(gòu)造方法,在CREATE OBJECT語句中自動調(diào)用構(gòu)造方法 使用幾個create object就調(diào)用幾次構(gòu)造方法。 ·什么時候使用構(gòu)造方法 –需要分配(外部)資源 –需要初始化一些不能用DATA 語句的VALUE 指定的屬性值 –需要修改靜態(tài)屬性 –通常不能顯式的調(diào)用構(gòu)造器 構(gòu)造器方法 ![]() 參數(shù)要在carete object的時候?qū)搿?/p> ![]() ![]() ·什么是類的繼承? –繼承的本質(zhì)是代碼重用。當要構(gòu)造一個新類時,無需從零開始,可以參考一個已有類,再其基礎(chǔ)上簡歷一個新類。 –參考類:基類/父類。新建類:派生類/子類 –派生類可以繼承基類所有的屬性和方法,并可以在此基礎(chǔ)上添加新的特性 ·語句 –CLASSDEFINITION INHERITING FROM. ·多態(tài)性類繼承的實現(xiàn) –由于每個派生類的屬性不同,相同的基類對象在不同的派生類中需要以不同的方式來表現(xiàn),因此提供多態(tài)的概念。 –在派生類中定義和基類相同的接口,但是可以使用不同的代碼來實現(xiàn)。 ·語句 –METHOD 父類方法名REDEFINITION .對父類已有方法的重定義“ –在派生類中使用基類的方法(子類調(diào)用父類方法的語句), 使用SUPER:CALL METHOD SUPER->. ![]() –重載方法,使用ME:CALL METHOD ME->. 調(diào)用子類的方法 以下兩種調(diào)用效果類似 ![]() ![]() 抽象類以及方法 抽象類 ·CLASSDEFINITION ABSTRACT . / ENDCLASS . ![]() 抽象類的聲明定義 ·抽象方法 –僅包含方法定義,但沒有具體實現(xiàn)的方法,需要通過派生類來實現(xiàn) ·METHODSABSTRACT . ![]() ![]() 抽象類中可以定義實例方法,并實現(xiàn); 也可以定義抽象方法,但是抽象方法只需定義不需要實現(xiàn)。 非抽象類中不能定義抽象方法 如果需要實現(xiàn)抽象類中的抽象方法;則需要一個類繼承抽象類,并且重新定義抽象方法然后實現(xiàn)。 ![]() 接口 –和抽象類相似,定義了一些未實現(xiàn)的屬性和方法,所有繼承它的類都繼承這些成員 –不需要方法實現(xiàn),不能直接實例化 –接口所有成員都是抽象的 –接口成員一般是公有的 –接口中不能含有構(gòu)造方法 ![]() 接口的定義;在類之外 ![]() 在類中的publicsection中將接口寫進去 在類的實現(xiàn)(implementation)中寫出接口中包含的方法的實現(xiàn)。 ![]() METHOD 接口名~(波浪線)方法名. ENDMETHOD. "接口中的方法調(diào)用 ![]() CALL METHOD 對象名->接口~方法 若在接口中定義的方法名太長,可以在類定義中的接口中給方法取別名 ![]() ALIASES 別名 FOR 接口名~原方法名.;;在取別名之后, 調(diào)用方法就可以直接對象名->方法別名。 不需要加上 接口~ ·事件(EVENT)(事件的發(fā)生至少需要兩個類) ![]() ·事件類型分為4種 –定義在類中的:實例事件,靜態(tài)事件 –定義在接口中的:實例事件,靜態(tài)事件 ·對于實例事件,注冊語句必須使用FOR指定注冊對象 –… FOR ref . –… FOR ALL INSTANCES(注冊所有可以觸發(fā)該事件的實例,包括尚未被創(chuàng)建的實例) ·注冊靜態(tài)事件,不需加FOR后綴,自動應(yīng)用于整個類 · ·當程序執(zhí)行到RAISE EVENT語句后,所有已注冊的處理方法都將在下一個語句之前被處理。處理方法按照其在系統(tǒng)內(nèi)部注冊的順序被執(zhí)行。為避免無限循環(huán),目前事件處理最多不能超過64級嵌套。 ![]() ![]() 創(chuàng)建方法 查找 數(shù)據(jù) 若查到就觸發(fā)事件輸出數(shù)據(jù) ![]() 觸發(fā)事件: RAISE EVENT事件名 ![]() 創(chuàng)建一個新類;方法綁定事件;METHODS 名 FOR EVENT 名 OF 類名 導入/導出 數(shù)據(jù);;并在實現(xiàn)中寫出方法功能 注冊是針對 對象 注冊 ![]() 新類創(chuàng)建對象;;并注冊事件 SET HANDLER 對象名-->方法名 FOR 上一對象名 附錄:代碼 REPORT ZWEN_0804. *----------------------------------------------------------------------* * INTERFACE INTER IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* INTERFACE INTER."接口 METHODS WRITE_INTER. ENDINTERFACE. "INTER IMPLEMENTATION *----------------------------------------------------------------------* * CLASS LCL_COMPT DEFINITION *----------------------------------------------------------------------* *定義類中的項目(屬性;方法;事件) *----------------------------------------------------------------------* CLASS LCL_COMPT DEFINITION. * 如 DATA ------ * 如 MESSAGE ------ * 如 METHODS ------ PUBLIC SECTION."公有 "實例屬性 DATA GV_CHAR(10) TYPE C VALUE '實例CHAR變量'. DATA GS_SCHOOL TYPE ZWEN_TEST_SCHOOL. "實例方法 METHODS WRITE_CHAR. TYPES GTY_CHAR10(10) TYPE C . TYPES GTY_CHAR5(10) TYPE C . METHODS SET_VALUE IMPORTING P_VALUE TYPE GTY_CHAR10."對gv——change賦值 METHODS GET_VALUE EXPORTING E_VALUE TYPE GTY_CHAR10."得到gv——change賦值 METHODS CON_VALUE IMPORTING I_VALUE1 TYPE GTY_CHAR5 I_VALUE2 TYPE GTY_CHAR5 I_VALUE3 TYPE GTY_CHAR5 EXPORTING R_SUBRC TYPE GTY_CHAR5. CLASS-DATA GV_CHANGE(10) TYPE C. DATA GV_CONCATENATE TYPE GTY_CHAR10.. "靜態(tài)屬性 CLASS-DATA GV_STATIC(20) TYPE C VALUE '靜態(tài)屬性'. "靜態(tài)方法 CLASS-METHODS WRITE_STATIC. "接口 INTERFACES INTER. METHODS GET_DATA IMPORTING P_SCHOOL LIKE GS_SCHOOL-ZSCHOOL. "事件 傳出 EVENTS DATA_EXIST EXPORTING VALUE(PS_SCHOOL) LIKE GS_SCHOOL. PROTECTED SECTION."保護 CLASS-DATA GV_SUPER TYPE C VALUE 'fuleishuxing'. ENDCLASS . "LCL_COMPT DEFINITION *----------------------------------------------------------------------* * CLASS LCL_HANDLER DEFINITION *----------------------------------------------------------------------* *事件接收器 *----------------------------------------------------------------------* CLASS LCL_HANDLER DEFINITION. PUBLIC SECTION. METHODS WRITE_DATA FOR EVENT DATA_EXIST OF LCL_COMPT IMPORTING PS_SCHOOL."方法綁定事件 ENDCLASS. "LCL_HANDLER DEFINITION *----------------------------------------------------------------------* * CLASS LCL_HANDLER IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS LCL_HANDLER IMPLEMENTATION. METHOD WRITE_DATA. WRITE:/ PS_SCHOOL-ZSCHOOL,PS_SCHOOL-ZSNAME. ENDMETHOD. "WRITE_DATA ENDCLASS. "LCL_HANDLER IMPLEMENTATION *----------------------------------------------------------------------* * CLASS LCL_COPMT IMPLEMENTATION *----------------------------------------------------------------------* *定義類中方法的內(nèi)容; *----------------------------------------------------------------------* CLASS LCL_COMPT IMPLEMENTATION. "實現(xiàn)實例方法 METHOD WRITE_CHAR. WRITE:/ '調(diào)用方法:', GV_CHAR. ENDMETHOD. "WRITE_CHAR METHOD SET_VALUE. GV_CHANGE = P_VALUE. ENDMETHOD. "SET_VALUE METHOD GET_VALUE. E_VALUE = GV_CHANGE. ENDMETHOD. "GET_VALUE *實現(xiàn)靜態(tài)方法 METHOD WRITE_STATIC. WRITE:/ '靜態(tài)方法',GV_STATIC. ENDMETHOD. "WRITE_STATIC METHOD CON_VALUE . CONCATENATE I_VALUE1 I_VALUE2 I_VALUE3 INTO GV_CONCATENATE. IF SY-SUBRC = 0. R_SUBRC = 'S'. ELSE. R_SUBRC = 'E'. ENDIF. ENDMETHOD. "CON_VALUE METHOD INTER~WRITE_INTER. WRITE:/ '接口中的方法'. ENDMETHOD. "WRITR_INTER METHOD GET_DATA. SELECT SINGLE * FROM ZWEN_TEST_SCHOOL INTO CORRESPONDING FIELDS OF GS_SCHOOL WHERE ZSCHOOL = P_SCHOOL. IF SY-SUBRC = 0."成功則輸出數(shù)據(jù) RAISE EVENT DATA_EXIST EXPORTING PS_SCHOOL = GS_SCHOOL."同方向 ELSE."失敗 WRITE:/ '取數(shù)失敗'. ENDIF. ENDMETHOD. "GET_DATA ENDCLASS. "LCL_COPMT IMPLEMENTATION *----------------------------------------------------------------------* * CLASS LCL_SUB DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS LCL_SUB DEFINITION INHERITING FROM LCL_COMPT."類的繼承 PUBLIC SECTION. METHODS WRITE_SUPER. ENDCLASS. "LCL_SUB DEFINITION *----------------------------------------------------------------------* * CLASS LCL_SUB IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS LCL_SUB IMPLEMENTATION. METHOD WRITE_SUPER. WRITE:/ '子類輸出方法',GV_CHAR."繼承父類publicsection屬性 WRITE:/ '子類輸出方法',GV_SUPER."繼承父類PROTECTEDsection屬性 ENDMETHOD. "WRITE_SUPER ENDCLASS. "LCL_SUB IMPLEMENTATION "聲明一個對象 DATA: LCL_OBJECT TYPE REF TO LCL_COMPT, LCL_OBJECT2 TYPE REF TO LCL_COMPT. START-OF-SELECTION. CREATE OBJECT LCL_OBJECT. CREATE OBJECT LCL_OBJECT2. "實例化 CREATE OBJECT LCL_OBJECT. WRITE:/ '訪問實例屬性', LCL_OBJECT->GV_CHAR. "修改類中定義的變量 LCL_OBJECT->GV_CHAR = '變化1'. "調(diào)用方法 CALL METHOD LCL_OBJECT->WRITE_CHAR. CALL METHOD LCL_OBJECT2->WRITE_CHAR. "靜態(tài)屬性不依附實例 WRITE:/ '訪問靜態(tài)屬性',LCL_COMPT=>GV_STATIC. CALL METHOD LCL_COMPT=>WRITE_STATIC."調(diào)用靜態(tài)方法 LCL_COMPT=>GV_STATIC = '修改后的靜態(tài)屬性'."修改驚濤屬性 CALL METHOD LCL_COMPT=>WRITE_STATIC. DATA GV_DATA TYPE LCL_OBJECT->GTY_CHAR10. "帶有參數(shù)方法的調(diào)用、 CALL METHOD LCL_OBJECT->SET_VALUE EXPORTING P_VALUE = '賦值操作'. CALL METHOD LCL_OBJECT->GET_VALUE IMPORTING E_VALUE = GV_DATA. WRITE :/ GV_DATA. DATA GV_SUBRC TYPE LCL_OBJECT->GTY_CHAR10. CALL METHOD LCL_OBJECT->CON_VALUE EXPORTING I_VALUE1 = 'HO' I_VALUE2 = 'WD' I_VALUE3 = 'CJ' IMPORTING R_SUBRC = GV_SUBRC. WRITE :/ GV_SUBRC. "接口中的方法調(diào)用 CALL METHOD LCL_OBJECT->INTER~WRITE_INTER. "事件的注冊及調(diào)用 DATA EVENT_HANDLER TYPE REF TO LCL_HANDLER. CREATE OBJECT EVENT_HANDLER. SET HANDLER EVENT_HANDLER->WRITE_DATA FOR LCL_OBJECT."注冊事件 CALL METHOD LCL_OBJECT->GET_DATA EXPORTING P_SCHOOL = '211'. |
|
來自: 昵稱46169147 > 《abap》