專利名稱:一種構(gòu)件的繼承方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種構(gòu)件的繼承方法,尤其是一種同時(shí)具有封裝性和多態(tài)性的構(gòu)件繼承方法。
背景技術(shù):
在現(xiàn)有的面向?qū)ο蟮母呒?jí)語(yǔ)言中如C++語(yǔ)言,面向?qū)ο蟪绦蛟O(shè)計(jì)的機(jī)制如有類、對(duì)象、派生與繼承、模板、虛函數(shù)等等。類的派生和繼承是經(jīng)常會(huì)被使用,在類的派生和繼承中,已存在的用來(lái)派生新類的類為基類,又稱為父類;由已存在的類派生出的新類為派生類,又稱為子類。C++的虛函數(shù)實(shí)現(xiàn)了面向?qū)ο蟮倪\(yùn)行時(shí)多態(tài)性,允許派生類取代基類所提供的實(shí)現(xiàn)。派生的新類將繼承其父類的操作和數(shù)據(jù)結(jié)構(gòu),運(yùn)行時(shí),在基類里調(diào)用虛函數(shù),會(huì)跳到其派生類的方法中執(zhí)行;派生類可以重載和調(diào)用其父類的虛函數(shù)。通過(guò)算柱狀體體積,舉例說(shuō)明現(xiàn)有的C++語(yǔ)言中的類繼承機(jī)制假設(shè)類Volume用于求橫截面是任意形狀的柱狀體體積的抽象類。定義及實(shí)現(xiàn)代碼如下 class Volume{publicvirtual double CalcArea()=0;//計(jì)算橫截面面積(純虛函數(shù))double CalcVolume(); //計(jì)算柱狀體體積double m_dfHigh; //柱狀體高度};double VolumeCalcVolume(){return CalcArea()*m_dfHigh;//體積=面積*高度} 從類Volume中派生出兩個(gè)類圓柱體類Column;橫截面是正方形的長(zhǎng)方體類Cuboid。定義及實(shí)現(xiàn)代碼如下 nCalcArea() { //圓面積=PI*半徑*半徑<!-- SIPO <DP n="1"> --><dp n="d1"/> return 3.1415926*m_dfRadius *m_dfRadius;}class Cuboidpublic Volume{public double CalcArea(); //重載計(jì)算橫截面面積的虛函數(shù) double m_dfside; //橫截面邊長(zhǎng)};double CuboidCalcArea(){ return m_dfside*m_dfside ; //正方形面積=邊長(zhǎng)*邊長(zhǎng)} 使用以上C++類的客戶端程序 int main(){Column columnObj;//圓柱體對(duì)象columnObj.m_dfRadius=3; //橫截面半徑為3columnObj.m_dfHigh=10; //圓柱體高度為10//計(jì)算并打印圓柱體體積printf(″Column volume%g\n″,columnObj.CalcVolume());Cuboid cuboidObj;//橫截面的正方形的長(zhǎng)方體對(duì)象cuboidObj.m_dfside=5; //橫截面邊長(zhǎng)為5cuboidObj.m_dfHigh=8; //長(zhǎng)方體高度為8//計(jì)算并打印長(zhǎng)方體體積printf(″Cuboid volume%g\n″,cuboidObj.CalcVolume());return 0;} 運(yùn)行結(jié)果是 Column volume282.743 Cuboid volume200 也就是說(shuō),求圓柱體體積時(shí)調(diào)用的是類Column重載的CalcArea()函數(shù),而求長(zhǎng)方體體積時(shí)調(diào)用的是類Cuboid重載的CalcArea()函數(shù)。即CalcArea()函數(shù)即能指向類Column的實(shí)例,又能指向類Cuboid的實(shí)例,這就是C++虛函數(shù)的多態(tài)性。但是,從上述也可以看出C++的虛函數(shù)技術(shù)是基于C++類的源代碼級(jí)別的繼承與重載機(jī)制,必須暴露基類的數(shù)據(jù)結(jié)構(gòu),違反了封裝性。
除了上述C++語(yǔ)言中的類繼承之外,現(xiàn)有還有兩種構(gòu)件繼承方法,一種為包容技術(shù),另一種為聚合技術(shù)。構(gòu)件是指對(duì)外提供一組規(guī)約化接口的,符合一定標(biāo)準(zhǔn)的、可替換的軟件系統(tǒng)得程序模塊。
下面通過(guò)算柱狀體體積的構(gòu)件為例講述如何復(fù)用該構(gòu)件。例子中CVolume是一個(gè)用于求任意橫截面的柱狀體體積的構(gòu)件。它的算體積接口需要知道橫截面的面積,而外部構(gòu)件(如圓柱體構(gòu)件)會(huì)實(shí)現(xiàn)一個(gè)算橫截面面積的接口。
如圖1為包容技術(shù)復(fù)用構(gòu)件算柱狀體體積的結(jié)構(gòu)圖,外部構(gòu)件如圓柱體構(gòu)件(CColumn)包含指向內(nèi)部構(gòu)件(CVolume)接口的指針。此時(shí)外部構(gòu)件僅僅是內(nèi)部構(gòu)件的一個(gè)客戶而已,它將使用內(nèi)部構(gòu)件的算體積接口來(lái)實(shí)現(xiàn)它自己的算體積接口。
外部構(gòu)件也可以通過(guò)將下述調(diào)用過(guò)程,轉(zhuǎn)發(fā)給內(nèi)部構(gòu)件的算體積方法來(lái)重新實(shí)現(xiàn)內(nèi)部構(gòu)件所支持的算體積接口。并且外部構(gòu)件還可以在內(nèi)部構(gòu)件代碼的前后加上一些代碼以對(duì)接口進(jìn)行改造。
算圓柱體體積的調(diào)用過(guò)程如下A創(chuàng)建CColumn構(gòu)件類的實(shí)例,在創(chuàng)建過(guò)程中會(huì)創(chuàng)建CVolume構(gòu)件類的實(shí)例并保存其接口指針;B用戶調(diào)用CColumn的算體積接口,在CColumn構(gòu)件類的實(shí)現(xiàn)中調(diào)用算橫截面面積接口實(shí)現(xiàn)的算橫截面面積方法;C把得到的橫截面面積作為參數(shù)傳入CVolume構(gòu)件類的設(shè)置橫截面面積接口;D最后調(diào)用CVolume構(gòu)件類的算體積接口得到結(jié)果并返回。但是這種上述的這種算體積構(gòu)建復(fù)用存在以下的缺點(diǎn)本來(lái)應(yīng)該復(fù)用CVolume構(gòu)件類的算體積接口,結(jié)果需要CColumn構(gòu)件類相應(yīng)地先實(shí)現(xiàn)一個(gè)算體積接口,并把橫截面面積參數(shù)傳給CVolume構(gòu)件類的設(shè)置橫截面面積接口方法中。因?yàn)镃Volume構(gòu)件無(wú)法直接調(diào)用CColumn的算橫截面積接口,CVolume構(gòu)件需要一個(gè)輔助的接口設(shè)置橫截面積接口。也即,在使用這種包容技術(shù)時(shí),存在著需要外部構(gòu)件將本該復(fù)用的接口,相應(yīng)先實(shí)現(xiàn),且內(nèi)部構(gòu)件需要設(shè)置輔助接口的缺點(diǎn)。
聚合是包容的一種變化形式。當(dāng)外部構(gòu)件聚合了某個(gè)內(nèi)部構(gòu)件的一個(gè)接口時(shí),它并沒(méi)有像包容那樣重新實(shí)現(xiàn)此接口并顯式地將調(diào)用請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部構(gòu)件。相反,外部構(gòu)件直接把內(nèi)部構(gòu)件的接口指針?lè)祷亟o客戶。使用這種方法,外部構(gòu)件將無(wú)需重新實(shí)現(xiàn)并轉(zhuǎn)發(fā)接口中的所有函數(shù)。但使用這種方式,外部構(gòu)件將無(wú)法對(duì)接口中的函數(shù)進(jìn)行任何改造。當(dāng)外部構(gòu)件將內(nèi)部構(gòu)件的接口返回給客戶之后,客戶就可以直接同內(nèi)部構(gòu)件打交道了。
圖2為聚合技術(shù)復(fù)用構(gòu)件算柱狀體體積的結(jié)構(gòu)圖,具體的調(diào)用過(guò)程如下a創(chuàng)建CColumn構(gòu)件類的實(shí)例,在創(chuàng)建過(guò)程中會(huì)創(chuàng)建CVolume構(gòu)件類的實(shí)例,并通過(guò)保存各自的IUnknown接口指針把兩個(gè)構(gòu)件聚合在一起,使其從外界看來(lái)是一個(gè)大構(gòu)件;b調(diào)用CCloumn實(shí)例的算橫截面面積接口得到圓柱的橫截面面積;c調(diào)用CVolume實(shí)例的設(shè)置橫截面面積接口;d調(diào)用CVolume的算體積接口得到體積。
上述的這種算體積所采用的聚合方法,存在著由于CVolume構(gòu)件無(wú)法直接調(diào)用CColumn的算橫截面積接口,CVolume構(gòu)件需要設(shè)置一個(gè)輔助接口設(shè)置橫截面積接口。因此,聚合技術(shù)存在著以下的缺點(diǎn)內(nèi)部構(gòu)件的接口完全暴露給用戶,外部構(gòu)件無(wú)法對(duì)內(nèi)部構(gòu)件的接口進(jìn)行改造;并且內(nèi)部構(gòu)件需要設(shè)置輔助接口。
下面介紹本發(fā)明所涉及的CAR構(gòu)件,CAR即Component ApplicationRuntime,是一種構(gòu)件技術(shù)。CAR構(gòu)件技術(shù)是面向構(gòu)件編程的編程模型,它規(guī)定了一組構(gòu)件間相互調(diào)用的標(biāo)準(zhǔn),使得二進(jìn)制構(gòu)件能夠自描述,能夠在運(yùn)行時(shí)動(dòng)態(tài)鏈接。
CAR與微軟的COM類似,但是和微軟COM相比,CAR刪除了COM中過(guò)時(shí)的約定,禁止用戶定義COM的非自描述接口;完備了構(gòu)件及其接口的自描述功能,實(shí)現(xiàn)了對(duì)COM的擴(kuò)展;對(duì)COM的用戶界面進(jìn)行了簡(jiǎn)化包裝,易學(xué)易用。
從上面的定義中,我們可以說(shuō)CAR是微軟COM的一個(gè)子集,同時(shí)又對(duì)微軟的COM進(jìn)行了擴(kuò)展,在SDK工具的支持下,使得高深難懂的構(gòu)件編程技術(shù)很容易被C/C++程序員理解并掌握。
發(fā)明內(nèi)容
本發(fā)明的目的是為了克服現(xiàn)由技術(shù)的缺陷,提供一種具有多態(tài)性、封裝性、多層繼承和多重繼承的構(gòu)建繼承方法,實(shí)現(xiàn)在構(gòu)件類繼承時(shí),即使基構(gòu)件類內(nèi)部代碼變動(dòng),對(duì)繼承其的派生類影響很小。
為實(shí)現(xiàn)上述目的,本發(fā)明提供了一種構(gòu)件的繼承方法。該方法包括 步驟1,創(chuàng)建基構(gòu)件類和第一派生構(gòu)件類的實(shí)例; 步驟2,所述基構(gòu)件類和第一派生構(gòu)件類的實(shí)例中分別獲取并保存對(duì)方的虛接口指針; 步驟3,調(diào)用所述基構(gòu)件類的第一輔助接口; 步驟4,根據(jù)所述基構(gòu)件實(shí)例保存的虛接口指針,調(diào)用所述第一派生構(gòu)件的虛接口,實(shí)現(xiàn)第一輔助接口。
由以上技術(shù)方案可知,當(dāng)基構(gòu)件類(基類)的一個(gè)接口是“虛接口”即在CAR構(gòu)件的接口定義中有virtual屬性時(shí),其派生構(gòu)件類將可以覆蓋該“虛接口”的所有方法,實(shí)現(xiàn)了構(gòu)件級(jí)別的多態(tài)性?;愂且粋€(gè)構(gòu)件,具有構(gòu)件的特性,包括封裝性?;惒豁毐┞镀鋬?nèi)部結(jié)構(gòu)?;愔灰涌诓蛔儯瑹o(wú)論怎樣升級(jí)更新或改變內(nèi)部結(jié)構(gòu),派生類都不需要重新編譯。
下面通過(guò)具體實(shí)施例并結(jié)合附圖對(duì)本發(fā)明做進(jìn)一步的詳細(xì)描述。
圖1為現(xiàn)有技術(shù)包容技術(shù)復(fù)用構(gòu)件算柱狀體體積的結(jié)構(gòu)圖; 圖2為現(xiàn)有技術(shù)聚合技術(shù)復(fù)用構(gòu)件算柱狀體體積的結(jié)構(gòu)圖; 圖3為本發(fā)明構(gòu)件繼承方法具體實(shí)施例1的結(jié)構(gòu)示意圖; 圖4為本發(fā)明構(gòu)件繼承方法具體實(shí)施例1的流程圖; 圖5為本發(fā)明構(gòu)件繼承方法的實(shí)施例2的結(jié)構(gòu)示意圖; 圖6為本發(fā)明構(gòu)件繼承方法的實(shí)施例2的流程圖; 圖7為本發(fā)明構(gòu)件繼承方法的實(shí)施例3的結(jié)構(gòu)示意圖。
具體實(shí)施例方式 本發(fā)明提供的這種構(gòu)件繼承方法,不僅具有多態(tài)性還具有多層性。外部構(gòu)件即派生構(gòu)件能夠重載內(nèi)部構(gòu)件即基構(gòu)件的虛接口,即基構(gòu)件的虛接口能夠被它的派生構(gòu)件重載,虛接口的方法能夠指向不同的派生構(gòu)件的實(shí)例,因此在這種構(gòu)件繼承方法中具有多態(tài)性。如圖3所示的本發(fā)明構(gòu)件繼承方法具體實(shí)施例1的結(jié)構(gòu)示意圖,在本實(shí)施例中,基構(gòu)件類為CVolume用于求任意橫截面的柱狀體體積的構(gòu)件,現(xiàn)需要根據(jù)該基構(gòu)件類計(jì)算圓柱體體積,構(gòu)建一圓柱體構(gòu)件類CColumn構(gòu)件類,該圓柱體構(gòu)件類繼承CVolume構(gòu)件類。
volume.car文件[ uuid(7677c5cf-9d3e-4d1f-bcfe-9e70feb62e5b), uunm(www.koretide.com/ezcom/volume.dll)]component VolumeComponent{ [uuid(27ae16a8-3f9f-4c5b-b33f-1be1cb2f3655)] interface ICrosssection{ HRESULT CalcArea([out]double*pdfArea); } [uuid(7b03e076-3bd2-4231-b2a4-75644179836e)] interface IVolume{ HRESULT SetHigh([in]double dfHigh); HRESULT CalcVolume([out]double*pdfVolume); } [uuid(07060acb-3026-4150-b770-7b34bd217264)] class CVolume{ public//下面定義的接口是public接口,可被繼承 virtual interface ICrosssection;//虛接口 interface IVolume; //一般接口 }} 其中“public”可以省略,表示在public作用域的接口可被繼承。類似的還有protected、private等關(guān)鍵字。在protected作用域里定義的接口可被繼承,但不能被構(gòu)件類的實(shí)例調(diào)用。而在private作用域里定義的接口不能被繼承,也不能被構(gòu)件類的實(shí)例調(diào)用。通常protected、private關(guān)鍵字修飾的接口是為實(shí)現(xiàn)該構(gòu)件類而定義的一些輔助接口。
virtual關(guān)鍵字表示該接口為“虛接口”,與C++語(yǔ)言中的虛函數(shù)對(duì)應(yīng),虛接口中的接口方法可被派生構(gòu)件重載,并且可以從基類中調(diào)用到重載后的派生類接口實(shí)現(xiàn)。在本范例的抽象構(gòu)件類CVolume中柱狀體體積的實(shí)現(xiàn),是調(diào)用虛接口ICrossSection中的CalcArea()得到橫截面面積,再乘以高度計(jì)算出來(lái)的。其中CalcArea()會(huì)跳到相應(yīng)派生類所重載的CalcArea()中執(zhí)行。
CVolume類的關(guān)鍵實(shí)現(xiàn)代碼……HRESULT CVolumeCalcArea( /*[out]*/double * pdfArea){ return E_NOTIMPL;//本基類不實(shí)現(xiàn)計(jì)算面積的方法,由派生類重載<br/>}HRESULT CVolumeCalcVolume( /*[out]*/double * pdfVolume){ if(pdfVolume){ double dfArea; //調(diào)用虛ICrossSection接口中的CalcArea()方法計(jì)算面積 //將會(huì)跳到派生類重載的CalcArea()方法執(zhí)行 MyVirtualICrossSection().CalcArea(&dfArea); //柱狀體體積=橫截面面積*高度 *pdfVolume=dfArea * m_dfHigh; return S_OK; } return S_FALSE; } MyVirtualICrossSection()函數(shù)是CAR自動(dòng)代碼生成工具實(shí)現(xiàn)的,函數(shù)返回ICrossSection虛接口的智能指針。
MyVirtualICrossSection().CalcArea(&dfArea)表示調(diào)用虛接口中的CalcArea()方法,而不是在本CVolume類CalcArea()方法。上述代碼表示了調(diào)用虛接口中的方法將會(huì)跳到派生類重載的該方法中去執(zhí)行。
派生類圓柱體的構(gòu)件描述文件column.car[ uuid(272eb044-0e9a-45db-a158-3a4cf60ddcb3), uunm(www.koretide.com/ezcom/column.dll)]component ColumnComponent{ importlib(″volume.dll″);//導(dǎo)入基類的元數(shù)據(jù) [uuid(0c608066-fdoc-4ad8-a2c0-149e7cbaf1a6)] interface IColumn{ HRESULT SetRadius([in]double dfRadius); } [uuid(4f145e76-80c1-4239-bb78-b1ec54211c57)] class CColumnCVolume{//繼承CVolume類 interface IColumn; }} 其中“importlib(“volume.dll”)”是為了導(dǎo)入基類的元數(shù)據(jù)信息,包括ICrossSection、IVolume接口和CVolume類的定義。
后面的“class CColumnCVolume”表示CColumn類繼承CVolume類。這樣,CColumn類就自然具有了ICrossSection和IVolume兩個(gè)public接口的定義與實(shí)現(xiàn)了(默認(rèn)調(diào)用基類相應(yīng)接口的實(shí)現(xiàn))。但是,基類的CalcArea()方法是未實(shí)現(xiàn)的(return E_NOTIMPL),需要重載。
CColumn.cpp的關(guān)鍵實(shí)現(xiàn)代碼如下……//重載calcArea()方法HRESULT CColumnCalcArea( /*[out]*/double*pdfArea){ if(pdfArea){ //圓的面積=PI*半徑*半徑 *pdfArea=3.1415926*m_dfRadius*m_dfRadius; return S_OK; } return S_FALSE;} 在構(gòu)建上述代碼之后,在主程序main()控制下,如圖4所示的流程圖,執(zhí)行以下步驟 步驟1創(chuàng)建CColumn構(gòu)件類即第一派生構(gòu)件類和CVolume類即基構(gòu)件類的實(shí)例; 步驟2CColumn派生構(gòu)件類和CVolume基構(gòu)件類實(shí)例各自保存另一方的虛接口即算橫截面面積接口的指針;具體代碼實(shí)現(xiàn)如上述MyVirtualICrossSection().CalcArea();該函數(shù)在CColumn派生構(gòu)件類和CVolume基構(gòu)件類實(shí)例的創(chuàng)建過(guò)程中返回智能指針后,CColumn派生構(gòu)件類實(shí)例和CVolume基構(gòu)件類實(shí)例分別將對(duì)方的虛接口ICrossSection接口中算橫截面面積方法CalcArea()指針保存;其中具體為該CColumn派生構(gòu)件類調(diào)用CVolume的IVirtualInheritHelper接口的SetMyVirtualInterfacePtr()函數(shù)將CColumn派生構(gòu)件類的虛接口指針傳遞給CVolume基構(gòu)件類,該虛接口即為CColumn所實(shí)現(xiàn)的ICrossSecsion接口,在實(shí)例化CVolume基構(gòu)件類和CColumn派生構(gòu)件類時(shí),創(chuàng)建CColumn派生類之后,派生類在創(chuàng)建CVolume基構(gòu)件類對(duì)象時(shí),在內(nèi)存中,設(shè)置m_virtualICrossSection和m_parentICrossSection接口指針,m_virtualICrossSection指針指向所實(shí)例化的CColumn構(gòu)件類的ICrossSection接口,m_parentICrossSection接口指針指向?qū)嵗腃Column構(gòu)件類的ICrossSection接口,CColumn派生類調(diào)用MyVirtualICrossSection()函數(shù),該函數(shù)是CAR自動(dòng)代碼生成工具實(shí)現(xiàn)的,函數(shù)返回ICrossSection虛接口的智能指針。
步驟3調(diào)用CVolume基構(gòu)件類的算體積接口即IVolume第一輔助接口;具體代碼如描述文件column.car中class CColumnCVolume{//繼承CVolume類;interface IColumn所示; 步驟4CVolume構(gòu)件類實(shí)例根據(jù)保存的CColumn構(gòu)件類的虛接口的指針,即算橫截面面積接口指針,調(diào)用CColumn構(gòu)件類的算橫截面面積接口,具體代碼如CColumn.cpp段代碼所示,實(shí)現(xiàn)算體積接口。
其中調(diào)用CColumn構(gòu)件類的算橫截面面積接口,實(shí)現(xiàn)圓的橫截面面積,具體為CColumn派生構(gòu)件類實(shí)例中,算橫截面面積接口重載CVolume基構(gòu)件類的虛接口中的方法。并且,在方法的參數(shù)和返回值類型必須與基類定義的一樣。
其中,基構(gòu)件類可以有多個(gè)虛接口以及第一輔助接口。派生構(gòu)件類可以重載多個(gè)虛接口,并且繼承基構(gòu)件類中多個(gè)第一輔助接口。
如圖5為本發(fā)明構(gòu)件繼承方法的實(shí)施例2結(jié)構(gòu)示意圖,在本實(shí)施例中,構(gòu)件繼承可以做到多層繼承。在這實(shí)現(xiàn)一個(gè)橫截面為半圓的柱狀體的構(gòu)件類。半圓柱體構(gòu)件類繼承圓柱體構(gòu)件類,其橫截面面積是后者的一半。以下是該類的構(gòu)件描述文件halfcolumn.car [ uuid(a464fadf-9f54-46bb-8e2d-798dobb239c6), uunm(www.koretide.com/ezcom/halfcolumn.dll)]component HalfColumnComponent{ importlib(″volume.dll″);//導(dǎo)入基類的元數(shù)據(jù) importlib(″column.dll″);//導(dǎo)入基類的元數(shù)據(jù) [uuid(24b74b7d-76af-46bf-ad37-8fb73cffd78b)] class CHalfColumnCColumn {//繼承CColumn類 }} 這里,CHalfColumn第二派生類繼承自CColumn第一派生類,而CColumn第一派生類繼承自Volume基構(gòu)件類。也就是說(shuō),CAR構(gòu)件繼承機(jī)制做到了多層繼承。
CHalfColumn.cpp的關(guān)鍵實(shí)現(xiàn)代碼如下……//重載CalcArea方法HRESULT CHalfColumnCalcArea( /*[out]*/double*pdfArea){ if(pdfArea){ double dfArea; //獲得父類CColumn橫截面面積(圓的面積) MyParentICrossSection().CalcArea(&dfArea); //半圓面積=圓的面積/2<!-- SIPO <DP n="10"> --><dp n="d10"/> *pdfArea=drArea/2; return S_OK; } return S_FALSE;} 半圓柱體構(gòu)件類重載的CalcArea()方法的實(shí)現(xiàn)是,先計(jì)算父類CColumn的橫截面面積再除以2。要獲得父類的橫截面面積,可以先調(diào)用MyParentICrossSection()函數(shù)獲得父類所實(shí)現(xiàn)的ICrossSection接口的智能指針,再執(zhí)行其CalcArea()方法。其中MyParentICrossSection()函數(shù)是自動(dòng)代碼生成工具根據(jù)構(gòu)件元數(shù)據(jù)所生成的代碼實(shí)現(xiàn)的,作用是返回父類所實(shí)現(xiàn)的ICrossSection接口的智能指針。命名規(guī)則是在接口名前拼上MyParent,表示父類所實(shí)現(xiàn)的相應(yīng)接口。所有從父類繼承下來(lái)的public或protected關(guān)鍵字修飾的接口都有與之對(duì)應(yīng)的MyParent函數(shù),方便在重載或?qū)崿F(xiàn)其它接口方法時(shí)調(diào)用父類的接口方法實(shí)現(xiàn)。
在構(gòu)建上述代碼之后,在主程序main()控制下,如圖6所示的實(shí)施例2的流程圖,在上述步驟4之后,還可包括以下步驟 步驟5,創(chuàng)建CHalfColumn第二派生構(gòu)件類的實(shí)例同時(shí)創(chuàng)建CColumn第一派生構(gòu)件類和CVolume基構(gòu)件類的實(shí)例; 步驟6CHalfColumn第二派生構(gòu)件類的虛接口即算橫截面面積接口指針保存到CColumn第一派生構(gòu)件類和CVolume基構(gòu)件類中;第二派生構(gòu)件類調(diào)用第一派生構(gòu)件類的IVirtualInheritHelper接口的SetMyVirtualInterfacePtr()函數(shù),將所述第二派生構(gòu)件類的虛接口指針傳遞給第一派生構(gòu)件類;第一派生構(gòu)件類調(diào)用基構(gòu)件類的IVirtualInheritHelper接口的初始化接口方法SetMyVirtualInterfacePtr()函數(shù),將第二派生構(gòu)件類的虛接口指針傳遞給所述基構(gòu)件類;設(shè)置好各對(duì)象的m_virtualICrossSection和m_parentICrossSection接口指針,其中所有m_virtualICrossSection指針指向所實(shí)例化的構(gòu)件類CHalfColumn類的ICrossSection接口,MyVirtualICrossSection()函數(shù)返回的該指針,另一方面,m_parentICrossSection指針指向父類的ICrossSection接口,以便重載時(shí)根據(jù)需要調(diào)用父類所實(shí)現(xiàn)的接口。MyParentICrossSection()函數(shù)返回該指針; 步驟7調(diào)用CVolume基構(gòu)件類的算體積接口即第一輔助接口; 步驟8根據(jù)基構(gòu)件實(shí)例保存的虛接口指針,調(diào)用第二派生構(gòu)件類CHalfColumn的虛接口即算橫截面面積接口,實(shí)現(xiàn)CVolume基構(gòu)件類的算體積接口。
在調(diào)用第二派生構(gòu)件類CHalfColumn的虛接口即算橫截面面積接口計(jì)算半圓橫截面實(shí)現(xiàn)中,調(diào)用CColumn第一派生構(gòu)件的算橫截面面積虛接口進(jìn)行計(jì)算,并把得到的結(jié)果除以2。
CHalfColumn類繼承自CColumn類,而CColumn類繼承自Volume類。也就是說(shuō),CAR構(gòu)件繼承機(jī)制做到了多層繼承。
由于基類CVolume沒(méi)有父類,所以沒(méi)有m_parentICrossSection變量,也就不需要設(shè)置了。對(duì)于另一個(gè)變量m_virtualICrossSection,該指針變量指向最外層類對(duì)象的ICrossSection接口。
基于上述基礎(chǔ),本發(fā)明構(gòu)件繼承還能做到多重層繼承。例如橫截面是半圓加上一個(gè)三角形的柱狀體體積如圖7實(shí)施例3所示結(jié)構(gòu)示意圖,具體過(guò)程為創(chuàng)建CTriangleHalfColumn構(gòu)件類的實(shí)例,在創(chuàng)建過(guò)程中會(huì)創(chuàng)建CHalfColumn、CColumn和CVolume類的實(shí)例。并且把CTriangleHalfColumn類的算橫截面面積接口指針保存到CHalfColumn、CColumn和CVolume類中??蛻粽{(diào)用CVolume的算體積接口;CVolume的算體積接口實(shí)現(xiàn)里調(diào)用外部構(gòu)件CTriangleHalfColumn的算橫截面面積接口,在第一步時(shí)保存了CTriangleHalfColumn的接口指針;CTriangleHalfColumn的算橫截面面積的實(shí)現(xiàn)中會(huì)調(diào)用CHalfColumn和Ctriangle類的算橫截面面積,并把得到的結(jié)果相加;得到CtriangleHalfColumn類的橫截面面積后,利用結(jié)果計(jì)算出體積并返回。
本發(fā)明提供了一種具有多態(tài)性、封裝性、多層繼承和多重繼承的構(gòu)建繼承方法。
最后所應(yīng)說(shuō)明的是,以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案而非限制,盡管參照較佳實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,可以對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明技術(shù)方案的精神和范圍。
權(quán)利要求
1、一種構(gòu)件的繼承方法,其特征在于,包括以下步驟
步驟1,創(chuàng)建基構(gòu)件類和第一派生構(gòu)件類的實(shí)例;
步驟2,所述基構(gòu)件類和第一派生構(gòu)件類的實(shí)例中分別獲取并保存對(duì)方的虛接口指針;
步驟3,調(diào)用所述基構(gòu)件類的第一輔助接口;
步驟4,根據(jù)所述基構(gòu)件實(shí)例保存的虛接口指針,調(diào)用所述第一派生構(gòu)件的虛接口,實(shí)現(xiàn)第一輔助接口。
2、根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟1中創(chuàng)建第一派生構(gòu)件類的實(shí)例具體包括所述第一派生構(gòu)件類繼承所述基構(gòu)件類的元數(shù)據(jù),以及繼承所述基構(gòu)件類中接口的方法。
3、根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟2中獲取對(duì)方的虛接口指針具體為所述第一派生構(gòu)件類調(diào)用基構(gòu)件類的初始化接口方法,將所述第一派生構(gòu)件類的虛接口指針傳遞給所述基構(gòu)件類。
4、根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟4中調(diào)用第一派生構(gòu)件的虛接口的實(shí)現(xiàn)具體為所述第一派生構(gòu)件的虛接口重載所述基構(gòu)件類的虛接口中的方法。
5、根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟5之后還包括以下步驟
步驟5,創(chuàng)建第二派生構(gòu)件、所述基構(gòu)件和第一派生構(gòu)件的實(shí)例;
步驟6,保存所述第二派生構(gòu)件的虛接口的指針到所述基構(gòu)件和第一派生構(gòu)件中;
步驟7,調(diào)用基構(gòu)件類的第一輔助接口;
步驟8,根據(jù)基構(gòu)件實(shí)例保存的虛接口指針,調(diào)用所述第二派生構(gòu)件的虛接口,實(shí)現(xiàn)基構(gòu)件類的第一輔助接口。
6、根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟1中創(chuàng)建第一派生構(gòu)件類的實(shí)例具體包括所述第一派生構(gòu)件類繼承所述基構(gòu)件類的元數(shù)據(jù),以及繼承所述基構(gòu)件類中接口的方法。
7、根據(jù)權(quán)利要求5所述的方法,其特征在于,所述步驟8中的調(diào)用第二派生構(gòu)件的虛接口的實(shí)現(xiàn)具體為調(diào)用第一派生構(gòu)件的虛接口。
8、根據(jù)權(quán)利要求5所述的方法,其特征在于,所述步驟6具體為所述第二派生構(gòu)件類調(diào)用第一派生構(gòu)件類的初始化接口方法,將所述第二派生構(gòu)件類的虛接口指針傳遞給所述第一派生構(gòu)件類;所述第一派生構(gòu)件類調(diào)用基構(gòu)件類的初始化接口方法,將所述第二派生構(gòu)件類的虛接口指針傳遞給所述基構(gòu)件類。
全文摘要
本發(fā)明涉及一種構(gòu)件的繼承方法,包括以下步驟創(chuàng)建基構(gòu)件類和第一派生構(gòu)件類的實(shí)例;所述基構(gòu)件類和第一派生構(gòu)件類的實(shí)例中分別獲取并保存對(duì)方的虛接口指針;調(diào)用所述基構(gòu)件類的第一輔助接口;根據(jù)所述基構(gòu)件實(shí)例保存的虛接口指針,調(diào)用所述第一派生構(gòu)件的虛接口,實(shí)現(xiàn)第一輔助接口。本發(fā)明實(shí)現(xiàn)了構(gòu)件級(jí)別的多態(tài)性、封裝性、多層繼承和多重繼承的構(gòu)建繼承方法,實(shí)現(xiàn)在構(gòu)件類繼承時(shí),即使基構(gòu)件類內(nèi)部代碼變動(dòng),對(duì)繼承其的派生類影響很小。
文檔編號(hào)G06F9/44GK1908896SQ200610030370
公開日2007年2月7日 申請(qǐng)日期2006年8月24日 優(yōu)先權(quán)日2006年8月24日
發(fā)明者梁宇洲, 陳永生, 黃凱峰, 蘇翼鵬, 陳榕 申請(qǐng)人:上??铺┦兰o(jì)科技有限公司