專利名稱:構件化軟件系統中構件的繼承方法
技術領域:
本發明涉及一種構件的繼承方法,尤其涉及一種構件化軟件系統中構件的繼承方法。
背景技術:
在C++或JAVA等面向對象語言中,可以通過源代碼級繼承來達到重用已有實現的 目的。 傳統的C++編程中的繼承方法,C++是基于代碼和實現的繼承,也就是說,對于派 生類來說,基類的源代碼和實現是必須完全開放的,在此基礎上才能被繼承。如果基類的成 員變量發生變化或者非常微小的代碼變化,都要引起派生類重新編譯,同時也會影響使用 派生類對象的用戶代碼。 隨著計算機軟件技術的不斷發展,構件化軟件技術已經越來越普及,各種各樣的 構件技術和支持這些構件技術的相應的嵌入式操作系統也應運而生。例如,基于基構件和 派生構件架構的構件技術,在該架構中,派生構件繼承于基構件,用于實現基于基構件的特 定功能,而基于該架構的嵌入式操作系統由于存在基構件與派生構件的繼承關系實現了作 業的時效性、針對性、便捷性。因此,如何解決構件化軟件系統中基構件與派生構件之間繼 承的關聯性問題已經成為人們必須面對的課題。
發明內容
鑒于以上內容,有必要提供一種構件化軟件系統中構件的繼承方法,可以使基構
件與派生構件之間的繼承具有源代碼和實現的無關性。
—種構件化軟件系統中構件的繼承方法,該方法包括如下步驟 步驟l,在構件化軟件系統聲明虛接口指針時,為聲明的虛接口指針創建對應的派
生構件的實例對象,將創建的實例對象輸出給聲明的虛接口指針; 步驟2,通過Probe函數從聲明的虛接口指針獲得普通接口的接口指針; 步驟3,通過普通接口的接口指針從外部調用基構件實現的方法; 步驟4,通過聲明的虛接口指針調用對應的派生構件實現的方法,實現派生構件重
載基構件實現的方法; 步驟5,在所述對應的派生構件實現的方法中,調用基構件實現的方法,實現派生
構件內部調用基構件已有實現的方法;及 步驟6,釋放創建的派生構件實例對象,執行結束。 相較于現有技術,本發明通過繼承其他構件的方式來重用被繼承構件所實現的接 口 ,重載被繼承構件的虛接口 ,實現了替代基構件的實現方法,使得基構件與派生構件之間 的繼承具有源代碼和實現的無關性。
圖1是本發明構件化軟件系統中構件的繼承方法較佳實施例的主流程圖。
圖2是圖1中步驟S20的細化流程圖。
圖3是圖1中步驟S40的細化流程圖。
具體實施例方式
如圖1所示,是本發明構件化軟件系統中構件的繼承方法的較佳實施例的流程 圖。該方法適用于能運行構件化軟件系統的數據處理設備。該數據處理設備是指手機、個 人數字助理(Personal DigitalAssistant, PDA)等裝置。所述構件化軟件系統為嵌入式 操作系統。該方法具有重用基構件已有實現、重載基構件的虛接口及接口調用時的多態性。 派生構件能夠重載基構件的虛接口 ,虛接口的方法能夠指向不同的派生構件的實現,因此 在這種構件繼承方法中具有多態性。在本較佳實施例中,基構件為CAnimal,派生構件為 CDog及CCat,所述派生構件繼承于基構件,所聲明的接口為虛接口 IGreeting及普通接口 IAnimal。
Animal, car構件代碼文件 Interface IGreeting{
Greet();〃為接口聲明一個方法
Interface IAnimal{
SetName (WString name);〃為接口聲明一個方法 GetName (WStringBuf_〈50>name);〃為接口聲明一個方法
class CAnimal(〃聲明一個基構件
virtual interface IGreeting//聲明該基構件實現IGreeting接 口 ,且將IGreeting作為虛接口
interface IAnimal class CDog :CAnimal {,
派生構件繼承于CAnimal interface IGreeting
將重載基構件的實現
class CCat :CAnimal {/ 生構件繼承于CAnimal
interface IGreeting
將重載基構件的實現
聲明該基構件實現IAnimal接口 /聲明一個名稱為CDog的派生構件,該
〃聲明實現IGreeting接口 ,這是個虛接口 ,
聲明一個名稱為CCat的派生構件,該派
聲明實現IGreeting接口 ,這是個虛接口 , } 其中,該Animal, car文件定義了兩個接口分別為IGreeting和IAnimal ,同時也定 義了一個基構件CAnimal,該基構件實現IGreeting和IAnimal接口。后面的class CDog : CAnimal或class CCat :CAnimal表示派生構件CDog和CCat繼承于基構件CAnimal 。這樣派生構件CDog和CCat就有了 IGreeting和IAnimal這兩個接口的定義與實現。virtual 關鍵字表示該接口為"虛接口 ",與C++語言中虛函數對應,虛接口中的接口方法Greet () 可被派生構件CDog和CCat重載,并且可以從基構件CAnimal中調用重載后的派生構件 CDog和CCat接口實現的方法。在本較佳實施例中,基構件CAnimal的實現,是調用虛接口 IGreeting中的Greet ()方法得到,其中,Greet ()方法會跳到派生構件CDog或CCat實現 的方法Greet ()中執行。 CAnimal基構件的實現代碼(CAnimal. cpp): Ecode CAnimal: : Greet () { Return E_NOTJMPLEMENT〃這里CAnimal沒有做任何操作 } ECode CAnimal: : SetName (WString name) 〃IAnimal接口方法 SetName在基構件CAnimal中的實現 { m_name. Copy (name) ;//將參數name的內容保存到成員變量m_name return N0ERR0R ; } ECode CAnimal: : GetName (WStringBuf*name) 〃IAnimal接口方 法GetName在基構件CAnimal中的實現 { name->Copy (m_name);〃將成員變量m_name的內容復制至lj out參數name return N0ERR0R ; } 其中,CAnimal: :Greet ()是IGreeting接口方法Greet ()在基構件CAnimal中的 實現,該實現沒有做任何操作(ReturnE_N0T_MPLEMENT),需要派生構件重載。 CDog派生構件的實現(CDog. cpp): ECode CDog: :Greet () { WStringBuf_〈100>out ; Super: :GetName (&out);〃在CDog里通過"Super::"調用基構件 實現的GetName方法,獲得animal的名字,并輸出到out變量里。 out《"Wang Wang ,,; CConsole: :WriteLine(out);〃調用控制臺輸出函數,將out的內容 打印到屏幕上 return N0ERR0R ; } IInterface氺CDog::Probe(EIID iid) {
5
If (iid == EIID—IInterface) ret證(IInterface氺)this ;
If (iid == EIID_IGreeting) return (IGreeting氺)this ;
} 其中,ECode CDog::Greet()是IGreeting接 口方法Greet ()在派生 構件CDog中的實現,以實現重載基構件CAnimal的實現CAnimal: : Greet ()。 IInterface*CDog: :Probe(EIID iid)是實現一個構件類在不同接口之間的轉換,通過獲 取對應接口類型指針實現不同接口之間的轉換。所述獲取對應接口類型指針的方法通 過Probe函數進行調用。Probe函數用于通過其中的一個接口指針獲取其它接口指針,實 現各種類型的接口指針之間的轉換。具體而言,在本較佳實施例中,假設用戶聲明的一個 IGreeting類型的虛接口指針pDog和一個IAnimal類型的普通接口 pAnimal,用戶可以通 過pDog虛接口指針獲取pAnimal接口指針。具體代碼如下
IAnimal*pAnimal = IAnimal::Probe(pDog); 以上代碼中,用戶通過IGreeting類型的虛接口指針pDog獲取一個IAnimal類型 的普通接口的接口指針pAnimal 。 CCat. c卯派生構件的實現代碼(CCat. cpp): ECode CCat: : Greet () 〃IGreeting接口方法Greet ()在派生構件CCat
中的實現,該實現將重載CAnimal: : Greet ()
{WStringBuf_〈100>out ;Super: :GetName (&out);〃在CDog里通過"Super::"調用基構件實
現的GetName方法,獲得animal的名字,并輸出到out變量里。
out《"Miao Miao ";CConsole: :WriteLine(out);〃調用控制臺輸出函數,將out的內容打 印到屏幕上return N0ERR0R ; } 其中,ECode CCat: :Greet ()是IGreeting接口方法Greet ()在派生構件
CCat中的實現,將重載CAnimal: : Greet ()。 在構建上述代碼之后,對上述代碼進行編譯,生成DLL (DynamicLinkable Library :動態鏈接庫)文件,生成的DLL文件提供兩個接口以供主程序調用,主程序通過聲 明接口指針調用所述生成的DLL文件。在主程序Main()控制下,如圖1所示的流程圖,執 行以下步驟 步驟S10 :在構件化軟件系統聲明虛接口指針時,為聲明的虛接口指針創建對應 的派生構件的實例對象,將創建的實例對象輸出給聲明的虛接口指針。具體而言,在本較佳 實施例中,聲明一個虛接口 IGreeting類型的虛接口指針pDog,創建一個派生構件CDog的 實例對象,將該對象輸出給pDog。具體代碼如下
IGreeting氺pDog =亂L ; CDog: :New (&pDog);〃創建一個CDog類型的實例對象,并通過pDog輸出。
步驟S20 :通過Probe函數從聲明的虛接口指針獲得該派生構件繼承的基構件的
6普通接口的接口指針。具體而言,在本較佳實施例中,具體代碼如下
IAnimal*pAnimal = IAnimal::Probe(pDog); 上述代碼中,因為pDog指向 一 個派生構件CDog的實例對象,CDog繼承于 CAnimal,具有基構件CAnimal實現的IAnimal接口 ,因此可以通過Probe函數從虛接口指 針pDog獲得普通接口 IAnimal的接口指針pAnimal 。 步驟S30 :通過普通接口的接口指針指針從外部調用基構件實現的方法。該步驟 的關鍵在于獲得基構件所實現的接口指針。具體而言,在本較佳實施例中,具體代碼如下
pAnimal_>SetName(L,,Dog,,); 上述代碼中,通過pAnimal接口指針調用IAnimal接口方法SetName (),該
pAnimal接口指針最終調用到基構件CAnimal實現的SetName ()方法。 步驟S40 :通過聲明的虛接口指針調用派生構件實現的方法,實現派生構件重載
基構件實現的方法,即實現派生構件重載基構件的實現。具體而言,在本較佳實施例中,具
體代碼如下 pDog_>Greet (); 上述代碼中,通過虛接口指針pDog調用IGreeting接口的Greet ()方法,由于 IGreeting是一個虛接口 , pDog實際指向的是CDog對象,所以,這里最終調用的Greet ()方 法是由派生構建類CDog實現的,這樣就實現了派生構件CDog重載基構件CAnimal實現的 方法Greet ()。 步驟S50 :在所述派生構件實現的方法中,調用基構件實現的方法,實現派生構件 內部調用基構件已有實現。具體而言,在所述派生構件實現的方法Greet ()中,通過在構件 化軟件系統中定義的關鍵字調用基構件CAnimal實現的方法GetName ()。在本較佳實施例 中,所述關鍵字為"Super",當用戶輸入關鍵字"Super"時,表明調用基構件實現的方法。具 體代碼如下 Super::GetName(&out); 上述代碼中,在派生構建類CDog里通過"Super::"調用基構件實現的GetName方 法。在其他實施例中,所述關鍵字可以為其它字符,如"Father "。 步驟S60 :釋放創建的派生構件實例對象,執行結束。具體而言,釋放創建的派生 構件實例對象PDog和pCat,具體代碼如下
pDog_>Release();
釋放對象之后,執行結束。 此外,用戶在聲明其它虛接口指針時,該虛指針的類型與上述聲明的虛接口類型,創 建另外一個派生構件的實例對象,將創建的實例對象輸出給聲明的虛接口指針,通過另外一個
虛接口指針調用派生構件實現的方法,實現了調用時的多態性。具體而言,具體代碼如下
IGreeting氺pCog =亂L ; CCat: :New(&pCat);〃創建一個CCat類型的實例對象,并通過pCat輸出。
上述代碼中,聲明一個IGreeting的接口指針,通過pCat虛接口指針調用派生 構件實現的方法Greet (),調用到派生構件CCat實現的方法Greet (),同樣是IGreeting 接口的虛接口指針pDog和pCat,調用相同的Greet ()方法,但輸出的結果卻完全不同,虛 接口指針pDog調用Greet ()方法輸出的結果是"Dog :Wang Wang ",而虛接口指針pCat調用Greet ()方法輸出的結果是"Cat :Miao Miao ",實現了調用時的多態 性。類似于0++的虛方法的多態性,使用IGreetingA類型的指針調用Greet ()方法,不同 的對象具有不同的實現,如果IGreetingA類型的指針指向CDog,則調用CDog: :Greet,如果 IGreetingA類型的指針指向的是CCat,則調用CCat: :Greet。但對于調用代碼來說,都是相 同的pGreet-〉Greet(),不同的派生構件實現的虛接口 IGreeting具有不同的語義和行為, 由此實現了基于構件接口的多態性。 如圖2所示,是圖1中步驟S20中獲得普通接口的接口指針的細化流程圖。
步驟S200,根據虛接口指針調用派生構件中的Probe函數。具體而言,在本較佳實 施例中,通過虛接口指針pDog調用派生構件CDog中的Probe函數。 步驟S201,判斷派生構件是否實現了普通接口的方法。具體而言,在本較佳實施例 中,判斷派生構件CDog是否實現了普通接口 IAnimal的方法,普通接口 IAnimal的方法包 括GetName ()或SetName ()。 步驟S202,若派生構件沒有實現普通接口的方法,則調用基構件中的Probe函數。 具體而言,在本較佳實施例中,調用基構件CAnimal中的Probe函數。 步驟S203,通過基構件中的Probe函數,獲得基構件的普通接口的接口指針。具體
而言,在本較佳實施例中,獲得基構件CAnimal的普通接口的接口指針pAnimal 。 在步驟S201中,若派生構件實現了普通接口的方法,則于步驟S205中,獲得派生
構件的虛接口指針,之后轉到上述步驟S40。 如圖3所示,是圖1中步驟S40中實現派生構件重載基構件的實現的細化流程圖。 所謂重載基構件的實現,就是當基構件和派生構件都實現了某個虛接口時,派生構件可以 用自己的實現重載基構件的實現。該步驟的關鍵在于獲得派生構件的虛接口指針。其中, 當基構件和派生構件都有自己虛接口的實現時,用戶調用這個接口必須要先通過Probe函 數來獲得虛接口指針,那么優先獲得派生構件實現的接口指針,如果派生構件沒有實現,再 獲得基構件實現的接口指針。 步驟S400,判斷虛接口指針是否指向對應的派生構件的實例對象。具體而言,在本 較佳實施例中,判斷虛接口指針pDog是否是CDog的實例對象。 步驟S401,若虛接口指針是指向對應的派生構件的實例對象,則調用派生構件中 的Probe函數。具體而言,在本較佳實施例中,若pDog指向的是CDog對象,則調用派生構 件CDog中的Probe函數。 步驟S402,判斷派生構件是否實現了該虛接口的方法。具體而言,在本較佳實施例 中,判斷CDog是否實現了 IGreeting接口方法Greet ()。 步驟S403,若派生構件實現了該虛接口的方法,則獲得該派生構件的虛接口指針, 通過獲得的虛借口指針實現派生構件重載基構件實現的方法。具體而言,在本較佳實施例 中,派生構件CDog實現了 IGreeting接口方法Greet (),則獲得派生構件CDog的接口指針 pDog。 在步驟S400中,若虛接口指針沒有指向對應的派生構件的實例對象,則于步驟 S404,調用基構件中的Probe函數。具體而言,若虛接口指針pDog指向的不是派生構件CDog 的實例對象,則調用CAnimal的Probe函數。 步驟S405,獲得基構件的普通接口的接口指針。具體而言,獲得基構件CAnimal的普通接口的接口指針pAnimal 。 在步驟S402中,若派生構件沒有實現該虛接口的方法,則轉到步驟S404。具體 而言,若派生構件CDog沒有實現該虛接口 IGreeting的方法Greet (),則調用CAnimal的 Probe函數,獲得基構件CAnimal的普通接口的接口指針。 最后所應說明的是,以上實施例僅用以說明本發明的技術方案而非限制,盡管參 照以上較佳實施例對本發明進行了詳細說明,本領域的普通技術人員應當理解,可以對本 發明的技術方案進行修改或等同替換,而不脫離本發明技術方案的精神和范圍。
權利要求
一種構件化軟件系統中構件的繼承方法,適用于能運行構件化軟件系統的數據處理設備,其特征在于,該方法包括如下步驟步驟1,在構件化軟件系統中聲明虛接口指針時,為聲明的虛接口指針創建對應的派生構件的實例對象,將創建的實例對象輸出給聲明的虛接口指針;步驟2,通過Probe函數從聲明的虛接口指針獲得該派生構件繼承的基構件的普通接口的接口指針;步驟3,通過普通接口的接口指針從外部調用該基構件實現的方法;步驟4,通過聲明的虛接口指針調用對應的派生構件實現的方法,以實現派生構件重載基構件實現的方法;步驟5,在所述對應的派生構件實現的方法中,調用基構件實現的方法,以實現派生構件內部調用基構件已有實現的方法;及步驟6,釋放創建的派生構件實例對象,執行結束。
2. 如權利要求1所述的構件化軟件系統中構件的繼承方法,其特征在于,所述構件化 軟件系統為嵌入式操作系統。
3. 如權利要求1所述的構件化軟件系統中構件的繼承方法,其特征在于,所述數據處 理設備為手機或個人數字助理。
4. 如權利要求1所述的構件化軟件系統中構件的繼承方法,其特征在于,所述Probe 函數通過其中的一個接口指針獲取其它接口指針,從而實現各種類型的接口指針之間的轉 換。
5. 如權利要求1所述的構件化軟件系統中構件的繼承方法,其特征在于,所述步驟2具 體包括根據聲明的虛接口指針調用派生構件中的Probe函數; 判斷派生構件是否實現了普通接口的方法;若派生構件實現了普通接口的方法,則獲得派生構件的虛接口指針,否則,若派生構件 沒有實現普通接口的方法,則調用基構件中的Probe函數;及通過基構件中的Probe函數,獲得基構件的普通接口的接口指針。
6. 如權利要求1所述的構件化軟件系統中構件的繼承方法,其特征在于,所述步驟4實 現派生構件重載基構件實現的方法的關鍵在于獲得派生構件的虛接口指針,所述獲得派生 構件的虛接口指針具體步驟如下判斷虛接口指針是否指向對應的派生構件的實例對象;若虛接口指針是指向對應的派生構件的實例對象,則調用派生構件中的Probe函數; 判斷派生構件是否實現了該虛接口的方法;及若派生構件實現了該虛接口的方法,則獲得該派生構件的虛接口指針。
7. 如權利要求1所述的構件化軟件系統中構件的繼承方法,其特征在于,所述步驟5實 現派生構件內部調用基構件已有實現的方法是通過在構件化軟件系統中定義的關鍵字進 行調用的。
全文摘要
一種構件化軟件系統中構件的繼承方法,該方法包括如下步驟步驟1,在構件化軟件系統聲明虛接口指針時,為聲明的虛接口指針創建對應的派生構件的實例對象,將創建的實例對象輸出給聲明的虛接口指針;步驟2,通過Probe函數從聲明的虛接口指針獲得普通接口的接口指針;步驟3,通過普通接口的接口指針從外部調用基構件實現的方法;步驟4,通過聲明的虛接口指針調用對應的派生構件實現的方法,實現派生構件重載基構件實現的方法;步驟5,在所述對應的派生構件實現的方法中,調用基構件實現的方法,實現派生構件內部調用基構件已有實現的方法;步驟6,釋放創建的派生構件實例對象,執行結束。
文檔編號G06F9/44GK101770360SQ200810208049
公開日2010年7月7日 申請日期2008年12月29日 優先權日2008年12月29日
發明者宋世軍, 陳榕 申請人:上海科泰世紀科技有限公司