專(zhuān)利名稱(chēng):創(chuàng)建具體類(lèi)的實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種在計(jì)算機(jī)技術(shù)領(lǐng)域中創(chuàng)建類(lèi)的實(shí)現(xiàn)方法,尤其指創(chuàng)建具體類(lèi)的實(shí) 現(xiàn)方法。
背景技術(shù):
現(xiàn)在計(jì)算機(jī)軟件編程技術(shù)從面向?qū)ο缶幊痰矫嫦驑?gòu)件、中間件編程,是網(wǎng)絡(luò)時(shí)代 編程技術(shù)的飛躍。在面向?qū)ο缶幊讨校瑢?duì)象的概念拘泥于數(shù)據(jù)結(jié)構(gòu)加運(yùn)算。對(duì)象實(shí)現(xiàn)了程序模塊的 封裝,帶來(lái)了更加清晰的程序結(jié)構(gòu)。作為面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的C++,其編譯生成的目標(biāo) 代碼Obj文件,不含有類(lèi)信息,因此系統(tǒng)不可能利用類(lèi)提供動(dòng)態(tài)服務(wù)。在面向構(gòu)件編程中,構(gòu)件化編程模型是建立在面向?qū)ο蠹夹g(shù)的基礎(chǔ)之上,是完全 面向?qū)ο蟮?,提供了?dòng)態(tài)構(gòu)造部件模塊的機(jī)制。其中,Elastor操作系統(tǒng)的CAR (Component Application Runtime)作為一個(gè)面向構(gòu)件的編程模型,表現(xiàn)為一組編程規(guī)范,包括構(gòu)件、 類(lèi)、對(duì)象、接口等定義與訪問(wèn)構(gòu)件對(duì)象的規(guī)定。CAR規(guī)定了一組構(gòu)件間互相調(diào)用的標(biāo)準(zhǔn),使得 二進(jìn)制構(gòu)件能夠自描述,能夠在運(yùn)行時(shí)實(shí)現(xiàn)動(dòng)態(tài)鏈接。但是在面向構(gòu)件編程時(shí),客戶端需要考慮到底要?jiǎng)?chuàng)建哪些具體的類(lèi),增加了編程 的復(fù)雜度。
發(fā)明內(nèi)容
鑒于以上內(nèi)容,有必要提供一種創(chuàng)建具體類(lèi)的實(shí)現(xiàn)方法。該方法包括步驟在構(gòu)件 程序中聲明接口 ;定義聲明了上述接口的泛類(lèi);聲明實(shí)現(xiàn)所定義的泛類(lèi)的具體類(lèi);編譯構(gòu) 件程序并生成一個(gè)類(lèi)廠函數(shù);調(diào)用所述類(lèi)廠函數(shù)實(shí)現(xiàn)具體類(lèi)。本發(fā)明可以在編程時(shí),定義出一種泛類(lèi),該泛類(lèi)抽象出各個(gè)一般類(lèi)所具有的共同 的類(lèi)或接口特性,并且在定義該泛類(lèi)的創(chuàng)建函數(shù)時(shí),可以根據(jù)不同的策略自動(dòng)選擇創(chuàng)建不 同的具體類(lèi)。只要這些具體類(lèi)都是從該所定義的泛類(lèi)繼承來(lái)的,創(chuàng)建具體類(lèi)時(shí)可以直接使 用該泛類(lèi)的創(chuàng)建函數(shù)完成,客戶端就無(wú)需關(guān)心創(chuàng)建的是哪些具體類(lèi)。
圖1是本發(fā)明較佳實(shí)施例所聲明的類(lèi)之間的繼承關(guān)系示意圖。圖2是本發(fā)明較佳實(shí)施例創(chuàng)建具體類(lèi)的實(shí)現(xiàn)方法的流程圖。
具體實(shí)施例方式首先講述本發(fā)明涉及的術(shù)語(yǔ)CAR S卩 Component Assemble at Runtime,為應(yīng)用于 Elastos 操作系統(tǒng)上的構(gòu)件技 術(shù);CAR文件是Elastos操作系統(tǒng)中定義的用來(lái)描述構(gòu)件(component)的接口(interface)特征的描述文件。如圖1所示,是本發(fā)明較佳實(shí)施例所聲明的泛類(lèi)與具體類(lèi)之間的繼承關(guān)系示意 圖。在CAR (Component Assemble at Runtime)文件中,可以通過(guò)下列程序代碼定義一 個(gè)Generic泛類(lèi),在這里將Generic看作是一個(gè)規(guī)范Generic GCarrier {interface ICarrier ;}在上面的程序代碼中,通過(guò)該Generic關(guān)鍵字定義了 一個(gè)繼承某些接口的 Generic 泛類(lèi),艮口 GCarrier0然后再在CAR文件中聲明實(shí)現(xiàn)該Generic泛類(lèi)的具體類(lèi),如Class CGSMCarrier:GCarrier{interface ICarrier ;interface IGSMC arrier ;}及Class CCDMACarrierGCarrier{interface ICarrier ;interface ICDMACarrier ;}如圖1所示,在上面兩段程序代碼中,聲明了兩個(gè)實(shí)現(xiàn)所定義的泛類(lèi)的具體類(lèi) CGSMCarrier和CCDMACarrier。該兩個(gè)具體類(lèi)會(huì)繼承和實(shí)現(xiàn)泛類(lèi)GCarrier的所有接口。如圖2所示,是本發(fā)明較佳實(shí)施例創(chuàng)建具體類(lèi)的實(shí)現(xiàn)方法的流程圖。在本較佳實(shí) 施例中,以得到一個(gè)GSM或CDMA或者WiFi網(wǎng)絡(luò)的訪問(wèn)構(gòu)件為例進(jìn)行說(shuō)明。步驟S200,在CAR文件中,首先聲明一些接口,再通過(guò)關(guān)鍵字Generic定義一個(gè)泛 類(lèi),如GCarrier,該泛類(lèi)實(shí)現(xiàn)上述聲明的接口。如下列代碼段所示interface ICarrier { // j^X ICarrier ^ ΠConnect ();Disconnect ();GetName(WStringBuf_<50>name);}generic GCarrier { //定義一個(gè) GCarrier 泛類(lèi)interface ICarrier ;}步驟S202,在上述 CAR文件中,聲明實(shí)現(xiàn)該泛類(lèi)的具體類(lèi),如CGSMCarrier和 CCDMACarrier,該兩個(gè)具體類(lèi)實(shí)現(xiàn)了該泛類(lèi)GCarrier所聲明的所有接口,見(jiàn)下列代碼段所 示interface IGSMCarrier { //定義一個(gè) IGSMCarrier 接口DoSomethingffithGSM();}
interface ICDMACarrier { //定義一個(gè) ICDM ACarrier 接口DoSomethingffithCDMA();}class CGSMCarrier: :GCarrier{//聲明一個(gè)CGSMCarrier類(lèi),實(shí)現(xiàn)GCarrier所聲 明的所有接口interface ICarrier ;interface IGSMCarrier ;}class CCDMACarrier GCarrieH//聲明一個(gè) CCDMACarrier 類(lèi),實(shí)現(xiàn)GCarrier 所 聲明的所有接口interface ICarrier ;interface ICDMACarrier ;}步驟S204,CAR編譯工具編譯上述CAR文件,生成代碼框架,該代碼框架中包含了 IGSMCarrier和ICDMACarrier的所有函數(shù),也隱含生成了 ICarrier的所有函數(shù)。讓該兩個(gè) 具體類(lèi)CGSMCarrier和CCDMACarrier的實(shí)現(xiàn)者去填寫(xiě)具體代碼。步驟S206,對(duì)應(yīng)于在CAR文件中的通過(guò)generic關(guān)鍵字所定義的繼承ICarrier 接口的泛類(lèi)GCarrier,CAR編譯工具生成一個(gè)如GCarr i er New ()的類(lèi)廠函數(shù),并實(shí)現(xiàn)該 New()函數(shù)的方法,在本較佳實(shí)施例的敘述中,可將該New()函數(shù)稱(chēng)之為創(chuàng)建函數(shù)。這個(gè) GCarrier::New()函數(shù)的實(shí)現(xiàn)者在該函數(shù)里可以使用不同的策略決定生成具體哪一個(gè)繼 承GCarrier的具體類(lèi)的實(shí)例。在上面的代碼段里GCarrier: New ()函數(shù)通過(guò)一個(gè)隨機(jī)數(shù) 決定生成哪一個(gè)具體類(lèi)的實(shí)例。步驟S204及步驟S206可參考下列代碼段所示ECode GCarrier:New(/氺[out]氺/ICarrier氺氺ppICarrier){ECode ec ;//pretend to find a GSM or CDMA networkIlsrand(time (NULL));Int32 i = rand() % 10 -JI通過(guò)一個(gè)隨機(jī)數(shù)決定生成的具體類(lèi)的實(shí)例if (i <= 5) {ec = CGSMCarrierNew(ppICarrier);}else {ec = CCDMACarrier:New(ppICarrier);}//可以根據(jù)不同的策略調(diào)用PickCarrierWiFi. dll中的WiFi network//ec = GCarrierNewByImplementor(L" PickCarrierffiFi. dll",
pp I Carrier);return ec ;} 步驟S210,在用戶端程序中,調(diào)用上述的GCarrier::NeW()函數(shù),從而實(shí)例化一 個(gè)上述泛類(lèi)的具體類(lèi),如下述代碼段所示ECode ElastosMain(const BufferOf<WString>& args){ICarrier^pCarrier = NULL ;ECode ec = GCarrierNew(&pCarrier);if (FAILED (ec)) {CConsole: iffriteLineC Sorry, no carrier available 丨〃);return ec ;}Il比較是否為generic的具體類(lèi)pClsId = (ClassId*)pCarrier- > Probe(EIID_GENERIC_INF0);if(*pClsId ! = ECLSID_GCarrier) {pCarrier- > Release ();return E_CLASS_N0T_AVAILABLE ;}WStringBuf_<40>name ;pCarrier- > GetName(&name);CConsole::WriteLine(name);pCarrier- > Connect ();//do something…;;;;pCarrier-> Disconnect ();pCarrier- > Release ();eProcess: :Exit(O);return N0ERR0R ;}在上面的代碼段中可以看出,程序在運(yùn)行時(shí)會(huì)動(dòng)態(tài)地檢查CGSMCarrier 與GCarrier的一致性及/或CCDMACarrier與GCarrier的一致性,也就是說(shuō), 在 CAR 文件中必須已經(jīng)聲明 “class CGSMCarrier GCarrier {···} ” 或"class CCDMACarrier GCarrier {...} ”。用戶應(yīng)用代碼中只要寫(xiě)"ECode ec = GCarrier: :New (&pCarrier); ”就可以得到一個(gè)GSM或CDMA或者WiFi網(wǎng)絡(luò)的訪問(wèn)構(gòu)件,從 而也就實(shí)例化了一個(gè)具體類(lèi)。由以上結(jié)合代碼的敘述可知,在編程時(shí),定義出一種抽象出各個(gè)一般類(lèi)所具有的 共同的類(lèi)或接口特性的泛類(lèi),并且在定義該泛類(lèi)的創(chuàng)建函數(shù)時(shí),還可以根據(jù)不同的策略自 動(dòng)選擇創(chuàng)建不同的具體類(lèi)。只要?jiǎng)?chuàng)建的這些具體類(lèi)都是從該所定義的泛類(lèi)繼承來(lái)的,創(chuàng)建具體類(lèi)時(shí)就可以直接使用該泛類(lèi)的創(chuàng)建函數(shù)完成,客戶端就不需要關(guān)心創(chuàng)建的是哪些具體 的類(lèi) 。
權(quán)利要求
一種創(chuàng)建具體類(lèi)的實(shí)現(xiàn)方法,其特征在于,該方法包括步驟在構(gòu)件程序中聲明接口;定義聲明了上述接口的泛類(lèi);聲明實(shí)現(xiàn)所定義的泛類(lèi)的具體類(lèi);編譯構(gòu)件程序并生成一個(gè)類(lèi)廠函數(shù);調(diào)用所述類(lèi)廠函數(shù)實(shí)現(xiàn)具體類(lèi)。
2.如權(quán)利要求1所述的創(chuàng)建具體類(lèi)的實(shí)現(xiàn)方法,其特征在于,所聲明的具體類(lèi)實(shí)現(xiàn)了 泛類(lèi)所聲明的所有接口。
3.如權(quán)利要求1所述的創(chuàng)建具體類(lèi)的實(shí)現(xiàn)方法,其特征在于,步驟編譯構(gòu)件程序具體 包括對(duì)構(gòu)件程序進(jìn)行編譯,生成代碼框架;在該代碼框架中填寫(xiě)所聲明的具體類(lèi)的代碼。
4.如權(quán)利要求1所述的創(chuàng)建具體類(lèi)的實(shí)現(xiàn)方法,其特征在于,所述步驟調(diào)用所述類(lèi)廠 函數(shù)實(shí)現(xiàn)具體類(lèi)包括在該類(lèi)廠函數(shù)中,使用不同的策略決定生成繼承所述泛類(lèi)的具體類(lèi)的實(shí)例。
5.如權(quán)利要求4所述的創(chuàng)建具體類(lèi)的實(shí)現(xiàn)方法,其特征在于,所述類(lèi)廠函數(shù)為一個(gè)創(chuàng) 建函數(shù),在步驟調(diào)用所述類(lèi)廠函數(shù)實(shí)現(xiàn)具體類(lèi)中所使用的策略是在該創(chuàng)建函數(shù)里通過(guò)一個(gè)隨機(jī)數(shù)決定生成對(duì)應(yīng)的具體類(lèi)的實(shí)例。
6.如權(quán)利要求1所述的創(chuàng)建具體類(lèi)的實(shí)現(xiàn)方法,其特征在于,所述步驟定義一個(gè)泛類(lèi) 是通過(guò)一個(gè)generic關(guān)鍵字定義的,該generic關(guān)鍵字是對(duì)一類(lèi)構(gòu)件的類(lèi)及其函數(shù)實(shí)現(xiàn)的 抽象描述。
7.如權(quán)利要求1所述的創(chuàng)建具體類(lèi)的實(shí)現(xiàn)方法,其特征在于,該方法還包括步驟編譯后的構(gòu)件程序在運(yùn)行時(shí),動(dòng)態(tài)檢查所實(shí)現(xiàn)的具體類(lèi)與所定義的泛類(lèi)一致性。
全文摘要
本發(fā)明提供一種創(chuàng)建具體類(lèi)的實(shí)現(xiàn)方法,該方法包括在構(gòu)件程序中聲明接口;定義聲明了上述接口的泛類(lèi);聲明實(shí)現(xiàn)所定義的泛類(lèi)的具體類(lèi);編譯構(gòu)件程序并生成一個(gè)類(lèi)廠函數(shù);調(diào)用所述類(lèi)廠函數(shù)實(shí)現(xiàn)具體類(lèi)。本發(fā)明定義出一種泛類(lèi),該泛類(lèi)抽象出各個(gè)一般類(lèi)所具有的共同的類(lèi)或接口特性,并且在定義該泛類(lèi)的創(chuàng)建函數(shù)時(shí),可以根據(jù)不同的策略自動(dòng)選擇創(chuàng)建不同的具體類(lèi)。只要這些具體的類(lèi)都是從該所定義的泛類(lèi)繼承來(lái)的,創(chuàng)建具體類(lèi)時(shí)可以直接使用該泛類(lèi)的創(chuàng)建函數(shù)完成,客戶端就無(wú)需關(guān)心創(chuàng)建的是哪些具體類(lèi)。
文檔編號(hào)G06F9/44GK101882066SQ20091005088
公開(kāi)日2010年11月10日 申請(qǐng)日期2009年5月8日 優(yōu)先權(quán)日2009年5月8日
發(fā)明者宋世軍, 陳冬曉, 陳榕 申請(qǐng)人:上海科泰世紀(jì)科技有限公司