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