專利名稱:調用構件對象功能的智能指針的封裝方法
技術領域:
本發明涉及一種調用構件對象功能的智能指針的封裝方法,特別是指一種用于在創建構件對象時,用于傳遞調用方參數或調用構件對象接口功能的智能指針的封裝方法,屬于計算機技術領域。
背景技術:
80年代以來,軟件編程技術有了很大的發展,其發展可以大致分為以下幾個階段面向對象編程,即通過對軟件模塊的封裝,使其相對獨立,從而使復雜的問題簡單化。面向對象編程強調的是對象的封裝,但模塊(對象)之間的關系在編譯的時候已被固定,模塊之間的關系是靜態的,這種關系在程序運行時不能改變;也就是說在運行時不能換用模塊中更小的功能單元。
面向構件編程,即為了使不同軟件開發商提供的構件模塊(軟件對象)可以相互操作使用,構件之間的連接和調用通過標準的協議來實現。構件化編程模型強調協議標準,需要提供各廠商都能遵守的協議體系。就像公制螺絲的標準一樣,所有符合標準的螺絲和螺母都可以相互裝配。構件化編程模型建立在面向對象技術的基礎之上,是完全面向對象的,提供了動態構造部件模塊(在運行中可以構造部件)的機制。構件在運行時可以動態裝入,是可以更換的。但是,現有的面向構件編程技術要求用戶自行定義構件的非自描述接口,使得用戶程序的開發依然繁復。
智能指針用于封裝指針功能。現有的一些智能指針類用于封裝組件對象模型(The Component Object Model,簡稱COM)接口指針,這些這些智能指針自動進行查詢接口,和處理增、減引用計數構造或析構構件對象,并可以調用構件對象接口的功能。
例如以C++程序設計語言為例在COM編程中,如果一個對象CObject實現了接口IA、接口IB和接口IC;接口IA中包括功能FA,接口IB中包括功能FB,接口IC中包括有功能FC。這樣,如果用戶要調用功能FA、FB、FC時,需要寫出下面的C++代碼才能調用到功能FA、FB和FC,(假定用戶已經獲得接口IA的接口指針pIA)......
pIA→FA(...);IB*pIB;IC*pIC;pIA→QueryInterface(IID_IB,&pIB);pIA→QueryInterface(IID_IC,&pIC);pIB→FB(...);pIC→FC(...);pIB→Release();pIC→Release();......
為了簡單,上述的C++代碼沒有考慮功能調用失敗的情況。即使如此,上述的調用需要用戶編寫九行程序,這給編程帶來了一定的復雜度。
發明內容
本發明的主要目的在于提供一種構件端接口智能指針的實現方法,用于構件的調用方通過接口智能指針訪問該接口所定義的功能,并實現智能管理引用計數和創建構件對象。
本發明的另一目的在于提供一種直接訪問構件接口的智能指針的封裝方法,通過類智能指針調用構件對象實現的所有接口功能,降低編程的復雜度。
本發明的又一目的在于提供一種基于類別的智能指針的封裝方法,類別智能指針類中的成員變量,與具有相同特性的構件所組成的構件類中的所有接口相對應,用于調用構件類對象實現的所有接口功能,降低編程的復雜度。
本發明的目的是這樣實現的一種構件端接口智能指針的實現方法用一個類實現第一種類型接口智能指針,該第一種類型接口智能指針只做為構件對象的調用方向該構件對象的被調用方接口功能傳遞參數時,不進行引用計數的增加或者減少;用一個類實現第二種類型接口智能指針,該第二種類型接口智能指針用于構造、析構和賦值被調用方的構件對象接口功能時,還增加或者減少引用計數;該第一、二種類型接口智能指針均用于創建構件對象。
當構造一接口智能指針對象時,且當一個非空的接口指針從一個內存位置拷貝到另一個內存位置時,增加一個引用計數。
當析構一接口智能指針對象,或當兩個智能指針對象之間進行賦值時,對于已經包含非空接口指針的內存位置,在重寫該內存位置之前,先減少一個引用計數。
一種直接訪問構件對象所有功能的智能指針的封裝方法,類智能指針設有與構件對象實現的接口相對應的成員變量,該成員變量用于調用構件對象實現的接口功能。該成員變量至少為一個,且該成員變量的數量與構件對象實現的接口個數相等。類智能指針實現方式具體為類智能指針通過繼承接口智能指針實現。
所述的類智能指針實現方式具體為類智能指針直接在該類中設置與構件對象實現接口一一對應的成員變量,類智能指針直接在該類中定義,并實現該構件對象實現的所有接口功能。
一種基于類別的智能指針的封裝方法,類別智能指針包括與類別中所有接口相對應的成員變量,該成員變量用于調用繼承了該類別的構件對象實現的該類別所有的接口功能。
所述的類別智能指針具有一個或以上的成員變量,該成員變量的數量與構件類中的構件對象實現的接口個數相等;該類別智能指針用于創建構件對象。
所述的類別智能指針實現方式具體為類別智能指針通過繼承接口智能指針實現。
所述的類別智能指針實現方式具體為類別智能指針包括與類別中所有接口相對應的成員變量,該成員變量用于調用繼承了該類別的構件對象實現的該類別所有的接口功能。
本發明用于構件的調用方通過接口智能指針訪問該接口所定義的功能,實現了智能管理引用計數;通過類智能指針調用構件對象實現的所有接口功能,降低了編程的復雜度;類別智能指針類中的成員變量與具有相同特性構件所組成的構件類的所有接口相對應,同時方便了對構件對象根據需要進行靈活的配置。
圖1為本發明接口智能指針中成員變量與構件對象實現的接口之間的關系示意圖;圖2為本發明接口智能指針通過成員變量調用構件對象實現對應功能的示意圖;圖3為本發明不同類型接口智能指針相互之間繼承關系的示意圖;
圖4為本發明類智能指針繼承接口智能指針的繼承關系示意圖;圖5為本發明類智能指針中的各成員變量與構件對象實現的各接口之間的關系示意圖。
具體實施例方式
以下結合附圖和具體的實施例對本發明作進一步的詳細說明在基于構件對象的平臺中,用戶可通過接口智能指針來訪問該這個接口所定義的方法,因此,接口智能指針是對接口的封裝。本發明對接口智能指針的實現以C++程序設計語言為例,具體如下將接口智能指針定義為類,這個類中只設有一個成員變量,該成員變量就是實際的指向對象接口的接口指針。
參見圖1和圖2,其中接口智能指針IARef與接口IA對應。接口智能指針類實現該接口的所有方法這些接口方法都通過成員變量調用構件對象實現的方法來實現。
本實施例中,當一個接口智能指針對象被構造時,當一個非空的接口指針從一個內存位置拷貝到另一個內存位置時,則應調用引用增加(AddRef)功能,以便通知對象又有附加的引用發生了;當一個接口智能指針對象被析構或兩個智能指針對象進行賦值時,則對于已經包含非空接口指針的內存位置來說,在重寫該內存位置之前,必須先調用釋放(Release)功能,以便通知構件對象“該引用已經被銷毀”;當接口智能指針做為入口(“[in]”)接口參數時,則上述兩種情況下的AddRef功能和Release功能的調用可以被優化掉。
具體而言,在本實施例中實現了兩種類型的智能指針,其一只能做為[in]參數使用,而另外一種則繼承前一種智能指針,對于構造,析構和賦值操作則進行相應的增加和減少引用計數。
以C++程序設計語言為例,如果接口智能指針IXXXRefArg實現為[in]接口參數,而作為接口智能指針IXXXRefArg的繼承,接口智能指針IXXXRef中的構造、析構和賦值則進行相應的增加和減少引用計數。
對于IUnknown接口(Iunknown為美國微軟公司COM規范中的一種接口)的兩個接口智能指針類,接口智能指針類InterfaceRefArg和接口智能指針類InterfaceRef,其中,接口智能指針類InterfaceRef繼承了接口智能指針類InterfaceRefArg。其中,接口智能指針類InterfaceRefArg中定義了一個成員變量IUnknown*m_pIface。其它所有接口智能指針追根溯源都繼承于該類,因此所有接口智能指針都具有該成員變量IUnknown*m_pIface。
正如所有的接口都繼承于IUnknown一樣,所有的接口智能指針都繼承于InterfaceRefArg。參見圖3,以接口IButton為例接口智能指針類IbuttonRef繼承于接口智能指針類IbuttonRefArg,接口智能指針類IbuttonRefArg和InterfaceRef均繼承于接口智能指針類InterfaceRefArg。
通過接口智能指針可以創建出實現了該接口的構件對象,并使該智能指針的成員變量指向這個新創建出的構件對象。
為了解決在編程中代碼復雜度不能降低的問題,本發明采用類智能指針對構件類封裝,假定已經有了指向上述的的CObject對象的類智能指針變量m_cObject。則調用上述三個功能FA、FB和FC的代碼為m_cObject.FA(...);m_cObject.FB(...);m_cObject.FC(...);由此可以看出使用類智能指針,代碼簡單且程序易懂。
在以C++語言為例類智能指針表現為類,這個類具有若干個成員變量。每個成員變量用來指向構件對象的一個接口,成員變量的數目等于構件對象實現的接口個數。成員變量和構件對象實現的接口一一對應。通過類智能指針,可以調用構件對象實現的所有接口功能。如上所述,通過類智能指針m_cObject,就可以調用接口IA的接口功能FA,也可以調用接口IB的接口功能FB,還可以調用接口IC的接口功能FC。
本發明中,類智能指針的實現可以有兩種方式參見圖4,以C++語言為例,類智能指針的第一種實現方式為類智能指針直接繼承接口智能指針;在這種情況下,當用戶調用構件對象實現的功能CObjectRef∷FA(...)時,事實上它調用的就是智能指針IARef對應的接口智能指針IARef∷FA(...)。
參見圖5,類智能指針的第二種實現方式為構件對象的類智能指針不繼承構件對象實現的所有接口對應的接口智能指針,而是直接在該類中定義若干個成員變量,每個成員變量對應一個該構件對象實現的接口,成員變量的個數等于構件對象實現的接口數目。類智能指針直接在該類中定義并實現該構件對象實現的所有接口功能。
在這種情況下,當用戶調用構件對象實現的功能CObjectRef∷FA(...)時,構件對象實現的功能CObjectRef∷FA(...)的實現將調用成員變量m_pIAface→FA(...)。
通過類智能指針可以創建出這個類智能指針對應的構件對象,并且使這個類智能指針繼承來的成員變量指向該新創建出的對象。
為了解決在編程中代碼復雜度不能降低的問題,同時方便對構件對象根據需要進行靈活的配置,本發明采用類別智能指針對構件類封裝。
就像接口智能指針是對接口的封裝一樣,類別智能指針是對類別的封裝。本發明將具有相同特點的構件對象接口劃分成一類。例如各種型號的聲卡均用于記錄和播放聲音,各種型號的聲卡都具有相應的驅動程序,因此可以把每種型號聲卡的驅動程序做成一個聲卡構件類;一個構件類中包括若干個接口,在該聲卡構件類中,所有的聲卡驅動構件均包含有一個相同的接口集合。一個類別為一個接口的集合,用于被構件類和類別進行繼承。所有繼承這個類別的構件類,都實現這個類別包括的所有接口。而繼承這個類別的類別,它的接口集合就變為兩個接口集合的并集。
本發明中,類別和構件類的區別是類別是一個接口的集合,用于被繼承;構件類也是一個接口的集合,構件類卻不能被繼承;所有繼承類別的構件類都必須實現該類別包括的所有接口。
本發明中類別智能指針的實現和類智能指針相同,即類別智能指針采用與類智能指針相同的方式實現,在此不再贅述。
最后應說明的是以上實施例僅用以說明本發明而并非限制本發明所描述的技術方案;因此,盡管本說明書參照上述的各個實施例對本發明已進行了詳細的說明,但是,本領域的普通技術人員應當理解,仍然可以對本發明進行修改或者等同替換;而一切不脫離本發明的精神和范圍的技術方案及其改進,其均應涵蓋在本發明的權利要求范圍當中。
權利要求
1.一種構件端接口智能指針的實現方法,其特征在于用一個類實現第一種類型接口智能指針,該第一種類型接口智能指針只做為構件對象的調用方向該構件對象的被調用方接口功能傳遞參數時,不進行引用計數的增加或者減少;用一個類實現第二種類型接口智能指針,該第二種類型接口智能指針用于構造、析構和賦值被調用方的構件對象接口功能時,還增加或者減少引用計數;該第一、二種類型接口智能指針均用于創建構件對象。
2.根據權利要求1所述的構件端接口智能指針的實現方法,其特征在于當構造一接口智能指針對象時,且當一個非空的接口指針從一個內存位置拷貝到另一個內存位置時,增加一個引用計數。
3.根據權利要求1所述的構件端接口智能指針的實現方法,其特征在于當析構一接口智能指針對象,或當兩個智能指針對象之間進行賦值時,對于已經包含非空接口指針的內存位置,在重寫該內存位置之前,先減少一個引用計數。
4.一種直接訪問構件對象所有功能的智能指針的封裝方法,其特征在于類智能指針設有與構件對象實現的接口相對應的成員變量,該成員變量用于調用構件對象實現的接口功能。
5.根據權要求4所述的直接訪問構件對象所有功能的智能指針的封裝方法,其特征在于所述的成員變量至少為一個,且該成員變量的數量與構件對象實現的接口個數相等。
6.根據權要求4或5所述的直接訪問構件對象所有功能的智能指針的封裝方法,其特征在于所述的類智能指針實現方式具體為類智能指針通過繼承接口智能指針實現。
7.根據權要求6所述的直接訪問構件對象所有功能的智能指針的封裝方法,其特征在于當接口智能指針只做為調用方向被調用方接口功能傳遞參數時,不進行引用計數的增加或者減少;當接口智能指針用于構造、析構和賦值被調用方的接口功能時,還增加或者減少引用計數。
8.根據權要求7所述的直接訪問構件對象所有功能的智能指針的封裝方法,其特征在于當構造一接口智能指針對象時,且當一個非空的接口指針從一個內存位置拷貝到另一個內存位置時,增加一個引用計數。
9.根據權要求7所述的直接訪問構件對象所有功能的智能指針的封裝方法,其特征在于當析構一接口智能指針對象,或當兩個智能指針對象之間進行賦值時,對于已經包含非空接口指針的內存位置,在重寫該內存位置之前,先減少一個引用計數。
10.根據權要求4或5所述的直接訪問構件對象所有功能的智能指針的封裝方法,其特征在于所述的類智能指針實現方式具體為類智能指針直接在該類中設置與構件對象實現接口一一對應的成員變量,類智能指針直接在該類中定義,并實現該構件對象實現的所有接口功能。
11.一種基于類別的智能指針的封裝方法,其特征在于類別智能指針包括與類別中所有接口相對應的成員變量,該成員變量用于調用繼承了該類別的構件對象實現的該類別所有的接口功能。
12.根據權利要求11所述的基于類別的智能指針的封裝方法,其特征在于所述的類別智能指針具有一個或以上的成員變量,該成員變量的數量與構件類中的構件對象實現的接口個數相等;該類別智能指針用于創建構件對象。
13.根據權利要求11或12所述的基于類別的智能指針的封裝方法,其特征在于所述的類別智能指針實現方式具體為類別智能指針通過繼承接口智能指針實現。
14.根據權利要求13所述的基于類別的智能指針的封裝方法,其特征在于當接口智能指針只做為調用方向被調用方接口功能傳遞參數時,不進行引用計數的增加或者減少;當接口智能指針用于構造、析構和賦值被調用方的接口功能時,還增加或者減少引用計數。
15.根據權利要求14所述的基于類別的智能指針的封裝方法,其特征在于當構造一接口智能指針對象時,且當一個非空的接口指針從一個內存位置拷貝到另一個內存位置時,增加一個引用計數。
16.根據權利要求14所述的基于類別的智能指針的封裝方法,其特征在于當析構一接口智能指針對象,或當兩個智能指針對象之間進行賦值時,對于已經包含非空接口指針的內存位置,在重寫該內存位置之前,先減少一個引用計數。
17.根據權利要求11或12所述的基于類別的智能指針的封裝方法,其特征在于所述的類別智能指針實現方式具體為類別智能指針包括與類別中所有接口相對應的成員變量,該成員變量用于調用繼承了該類別的構件對象實現的該類別所有的接口功能。
全文摘要
一種調用構件對象功能的智能指針的封裝方法,當接口智能指針做為構件對象方法的調用方傳遞給被調用方的參數時,不進行引用計數的增加和減少;當接口智能指針被構造、析構或賦值時,增加、減少引用計數;類智能指針包括與構件對象實現的接口相對應的成員變量,該成員變量用于調用構件對象實現的接口方法;類別智能指針包括與類別中所有接口相對應的成員變量,該成員變量用于調用繼承了該類別的構件對象實現的該類別所有接口的接口方法。本發明實現了智能管理引用計數和構件創建;通過類智能指針調用構件對象實現的所有接口功能,降低了編程的復雜度;類別智能指針類中的成員變量與接口相對應,實現了創建對象時的“多態”。
文檔編號G06F9/52GK1512340SQ0215948
公開日2004年7月14日 申請日期2002年12月31日 優先權日2002年12月31日
發明者陳榕, 葉忠強, 梁宇洲, 榕 陳 申請人:北京科泰世紀科技有限公司