資源描述:
《第7章 繼承和接口設(shè)計(jì)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、第7章繼承和接口設(shè)計(jì)7.1繼承7.2多態(tài)性7.3抽象類(lèi)7.4接口7.5接口在集合排序中的應(yīng)用7.6泛型編程7.1.1什么是繼承一個(gè)類(lèi)從另一個(gè)類(lèi)派生出來(lái)時(shí),稱(chēng)之為派生類(lèi)或子類(lèi),被派生的類(lèi)稱(chēng)為基類(lèi)或父類(lèi)。派生類(lèi)從基類(lèi)那里繼承特性,派生類(lèi)也可以作為其他類(lèi)的基類(lèi),從一個(gè)基類(lèi)派生出來(lái)的多層類(lèi)形成了類(lèi)的層次結(jié)構(gòu)。7.1繼承C#中只允許單繼承,即一個(gè)派生類(lèi)只能有一個(gè)基類(lèi)。C#中繼承是可傳遞的,如果C從B派生,B從A派生,那么C不僅繼承B的成員,還繼承A的成員。C#中派生類(lèi)可添加新成員,但不能刪除基類(lèi)的成員。C#中派生類(lèi)不
2、能繼承基類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù),但能繼承基類(lèi)的屬性。C#中派生類(lèi)可隱藏基類(lèi)的同名成員,如果在派生類(lèi)可以隱藏了基類(lèi)的同名成員,基類(lèi)該成員在派生類(lèi)中就不能被直接訪問(wèn),只能通過(guò)“base.基類(lèi)方法名”來(lái)訪問(wèn)。C#中派生類(lèi)對(duì)象也是基類(lèi)的對(duì)象,但基類(lèi)對(duì)象卻不一定是基派生類(lèi)的對(duì)象。也就是說(shuō),基類(lèi)的引用變量可以引用基派生類(lèi)對(duì)象,而派生類(lèi)的引用變量不可以引用基類(lèi)對(duì)象。C#中的繼承具有以下特點(diǎn):7.1.2派生類(lèi)的聲明派生類(lèi)的聲明格式如下:[類(lèi)修飾符]class派生類(lèi):基類(lèi);C#中派生類(lèi)可以從它的基類(lèi)中繼承字段、屬性、方法、事
3、件、索引器等。實(shí)際上除了構(gòu)造函數(shù)和析構(gòu)函數(shù),派生類(lèi)隱式地繼承了基類(lèi)的所有成員。classA{privateintn;//私有字段protectedintm;//保護(hù)的字段publicvoidafun()//公有方法{//方法的代碼}}classB:A{privateintx;//私有字段publicvoidbfun()//公有方法{//方法的代碼}}從中看出Base_fun()方法在B類(lèi)中不用重寫(xiě),因?yàn)锽類(lèi)繼承了A類(lèi),所以可以不用重寫(xiě)A類(lèi)中的Base_fun()方法,就可以被B類(lèi)調(diào)用。在主函數(shù)中包含以下代碼
4、:Bb=newB();//定義對(duì)象并實(shí)例化b.afun();7.1.3基類(lèi)成員的可訪問(wèn)性派生類(lèi)將獲取基類(lèi)的所有非私有數(shù)據(jù)和行為。如果希望在派生類(lèi)中隱藏某些基類(lèi)的成員,可以在基類(lèi)中將這些成員設(shè)為private訪問(wèn)成員。7.1.4按次序調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)1.調(diào)用默認(rèn)構(gòu)造函數(shù)的次序如果類(lèi)是從一個(gè)基類(lèi)派生出來(lái)的,那么在調(diào)用這個(gè)派生類(lèi)的默認(rèn)構(gòu)造函數(shù)之前會(huì)調(diào)用基類(lèi)的默認(rèn)構(gòu)造函數(shù)。調(diào)用的次序?qū)淖钸h(yuǎn)的基類(lèi)開(kāi)始。classA//基類(lèi){publicA(){Console.WriteLine("調(diào)用類(lèi)A的構(gòu)造函數(shù)");}}
5、classB:A//從A派生類(lèi)B{publicB(){Console.WriteLine("調(diào)用類(lèi)B的構(gòu)造函數(shù)");}}classC:B//從B派生類(lèi)C{publicC(){Console.WriteLine("調(diào)用類(lèi)C的構(gòu)造函數(shù)");}}在主函數(shù)中執(zhí)行以下語(yǔ)句:Cb=newC();//定義對(duì)象并實(shí)例化運(yùn)行結(jié)果如下:調(diào)用類(lèi)A的構(gòu)造函數(shù)調(diào)用類(lèi)B的構(gòu)造函數(shù)調(diào)用類(lèi)C的構(gòu)造函數(shù)2.調(diào)用默認(rèn)析構(gòu)函數(shù)的次序當(dāng)銷(xiāo)毀對(duì)象時(shí),它會(huì)按照相反的順序來(lái)調(diào)用析構(gòu)函數(shù)。首先調(diào)用派生類(lèi)的析構(gòu)函數(shù),然后是最近基類(lèi)的析構(gòu)函數(shù),最后才調(diào)用那個(gè)
6、最遠(yuǎn)的析構(gòu)函數(shù)。classA//基類(lèi){~A(){Console.WriteLine("調(diào)用類(lèi)A的析構(gòu)函數(shù)");}}classB:A//從A派生類(lèi)B{~B(){Console.WriteLine("調(diào)用類(lèi)B的析構(gòu)函數(shù)");}}classC:B//從B派生類(lèi)C{~C(){Console.WriteLine("調(diào)用類(lèi)C的析構(gòu)函數(shù)");}}在主函數(shù)中執(zhí)行語(yǔ)句Cb=newC();其運(yùn)行結(jié)果如下:調(diào)用類(lèi)C的析構(gòu)函數(shù)調(diào)用類(lèi)B的析構(gòu)函數(shù)調(diào)用類(lèi)A的析構(gòu)函數(shù)3.調(diào)用重載構(gòu)造函數(shù)的次序調(diào)用基類(lèi)的重載構(gòu)造函數(shù)需使用base關(guān)鍵字。
7、base關(guān)鍵字主要是為派生類(lèi)調(diào)用基類(lèi)成員提供一個(gè)簡(jiǎn)寫(xiě)的方法,可以在子類(lèi)中使用base關(guān)鍵字訪問(wèn)的基類(lèi)成員。調(diào)用基類(lèi)中重載構(gòu)造函數(shù)的方法是將派生類(lèi)的重載構(gòu)造函數(shù)作如下設(shè)計(jì):public派生類(lèi)名(參數(shù)列表1):base(參數(shù)列表2){?}其中,“參數(shù)列表2”和“參數(shù)列表1”存在對(duì)應(yīng)關(guān)系。同樣,在通過(guò)“參數(shù)列表1”創(chuàng)建派生類(lèi)的實(shí)例對(duì)象時(shí),先以“參數(shù)列表2”調(diào)用基類(lèi)的構(gòu)造函數(shù),再調(diào)用派生類(lèi)的構(gòu)造函數(shù)?!纠?.1】分析以下程序的運(yùn)行結(jié)果。usingSystem;namespaceProj7_1{classA{priv
8、ateintx;publicA(){Console.WriteLine("調(diào)用類(lèi)A的構(gòu)造函數(shù)");}publicA(intx1){x=x1;Console.WriteLine("調(diào)用類(lèi)A的重載構(gòu)造函數(shù)");}~A(){Console.WriteLine("A:x={0}",x);}}classB:A{privateinty;publicB(){Console.WriteLine("調(diào)用類(lèi)B的構(gòu)造函數(shù)");}pub