MES開發(fā)與應(yīng)用 課件 1.1.7 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-面向?qū)ο蟾呒墸?.1.8 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-集合;1.1.9 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-C#常用類_第1頁
MES開發(fā)與應(yīng)用 課件 1.1.7 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-面向?qū)ο蟾呒墸?.1.8 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-集合;1.1.9 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-C#常用類_第2頁
MES開發(fā)與應(yīng)用 課件 1.1.7 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-面向?qū)ο蟾呒墸?.1.8 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-集合;1.1.9 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-C#常用類_第3頁
MES開發(fā)與應(yīng)用 課件 1.1.7 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-面向?qū)ο蟾呒墸?.1.8 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-集合;1.1.9 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-C#常用類_第4頁
MES開發(fā)與應(yīng)用 課件 1.1.7 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-面向?qū)ο蟾呒墸?.1.8 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-集合;1.1.9 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-C#常用類_第5頁
已閱讀5頁,還剩180頁未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1.1.7面向?qū)ο蟾呒壣钲谑行畔⒙殬I(yè)技術(shù)學(xué)院類的繼承01目

錄Sealed關(guān)鍵字02多態(tài)03抽象類和接口04異常0506命名空間和程序集知識回顧類的定義及對象構(gòu)造方法this和static關(guān)鍵字面向?qū)ο蟮母拍钤L問修飾符垃圾回收嵌套類和匿名類對象初始化器學(xué)習(xí)目標(biāo)通過本節(jié)學(xué)習(xí)可以:重點(diǎn)學(xué)習(xí)類的繼承重點(diǎn)學(xué)習(xí)多態(tài)重點(diǎn)學(xué)習(xí)抽象類和接口掌握sealed關(guān)鍵字掌握異常了解命名空間和程序集01類的繼承類的繼承繼承的概念在現(xiàn)實(shí)生活中,繼承一般指的是子女繼承父輩的財(cái)產(chǎn)。在程序中,繼承描述的是事物之間的所屬關(guān)系,通過繼承可以使多種事物之間形成一種關(guān)系體系。例如貓和狗都屬于動物,在程序中便可認(rèn)為貓和狗繼承自動物,同理波斯貓和巴厘貓繼承自貓,而沙皮狗和斑點(diǎn)狗繼承自狗,這些動物之間會形成一個繼承體系。具體如下圖所示。類的繼承繼承的概念在C#中,類的繼承是指在一個現(xiàn)有類的基礎(chǔ)上去構(gòu)建一個新的類,構(gòu)建出來的新類被稱作子類,現(xiàn)有的類被稱作父類,子類會自動擁有父類所有可繼承的屬性和方法。例如動物和犬科的繼承關(guān)系,可以用如下代碼表示:classAnimal{}classDog:Animal{//Dog類繼承Animal類//Dog類可以自動擁有Animal類的屬性和方法}類的繼承繼承的概念在類的繼承中,需要注意一些問題,具體如下:繼承具有單一性,也就是說一個類只能有一個直接的父類,例如下面的語句是錯誤的。classA{}classB{}classC:A,B{}//C類不可以同時繼承A類和B類classA{}classB:A{}classC:A{}//類B和類C都可以繼承類A多個類可以繼承同一個父類,例如下面的語句是正確的。類的繼承繼承的概念在C#中,多層繼承是可以的,即一個類的父類可以再去繼承其他類,例如C類繼承自B類,B類又繼承自A類,此時C類也可稱作A類的子類,下面的語句是正確的。classA{}classB:A{}//B類繼承自A類,B類是A類的子類classC:B{}//C類繼承自B類,C類是B類的子類構(gòu)造方法的執(zhí)行過程構(gòu)造方法的執(zhí)行過程在上一章中學(xué)習(xí)了構(gòu)造方法的定義以及重載,了解到構(gòu)造方法可以用于初始化類的靜態(tài)成員和實(shí)例成員。在繼承關(guān)系中,構(gòu)造方法的執(zhí)行過程會變得有些不一樣,下面進(jìn)行具體分析。當(dāng)一個類的對象被創(chuàng)建時,如果該類擁有父類的話,在調(diào)用自身構(gòu)造方法的同時還會調(diào)用父類的構(gòu)造方法,其具體執(zhí)行過程如下圖所示。從圖中可以看出,子類在實(shí)例化對象時,首先會調(diào)用父類的構(gòu)造方法,然后再調(diào)用自身的構(gòu)造方法。隱藏基類方法隱藏基類方法子類在繼承父類時可以對父類的成員進(jìn)行擴(kuò)展,如果子類中出現(xiàn)與父類同名的方法,那么在調(diào)用該方法時程序就不能明確該方法是屬于父類還是子類,這時編譯器就會提示使用new關(guān)鍵字隱藏基類方法。接下來通過一個案例來演示如何隱藏基類方法。隱藏基類方法隱藏基類方法程序編譯出現(xiàn)警告,如下圖所示。根據(jù)程序編譯警告,將程序第9行代碼添加一個new關(guān)鍵字,修改后的代碼片段如下所示。classDog:Animal{publicnewvoidShout(){//與父類方法重名Console.WriteLine("汪汪......");}}添加new關(guān)鍵字隱藏基類方法隱藏基類方法運(yùn)行結(jié)果,如下圖所示。在示例中,Dog類繼承Animal類,同時Dog類中存在與父類相同的方法Shout(),因此,使用new關(guān)鍵字可以明確告訴編譯器執(zhí)行Dog類中的Shout()方法,解決繼承關(guān)系中方法同名的問題。裝箱和拆箱裝箱和拆箱在實(shí)際開發(fā)過程中,某些方法的參數(shù)類型為引用類型,如果調(diào)用時傳入的是數(shù)值類型,此時需要進(jìn)行裝箱操作。同樣當(dāng)一個方法的返回值類型為數(shù)值類型時,實(shí)際上該方法的返回值為引用類型,此時就需要進(jìn)行拆箱操作。簡單來說,裝箱就是將數(shù)值類型轉(zhuǎn)換為引用類型,拆箱就是將引用類型轉(zhuǎn)換為數(shù)值類型。接下來通過一個案例來學(xué)習(xí)裝箱與拆箱操作,具體如下所示。裝箱和拆箱裝箱和拆箱namespaceProgram04{classProgram{staticvoidMain(string[]args){intnum=100;objectobj=num;Console.WriteLine("對象obj的值為{0}",obj);num=(int)obj;Console.WriteLine("變量num的值為{0}",num);Console.ReadKey();}}}將int類型變量num賦值給object類型的變量obj,發(fā)生裝箱操作。將object類型的對象obj賦值給int類型的變量num,發(fā)生拆箱操作。裝箱和拆箱裝箱和拆箱運(yùn)行結(jié)果,如下圖所示。需要注意的是,裝箱與拆箱過程本質(zhì)上是數(shù)據(jù)存儲在棧與堆之間的變更,如果頻繁的進(jìn)行裝箱與拆箱操作勢必會影響程序的運(yùn)算效率,所以建議盡量減少相關(guān)操作。思考題簡述繼承的概念。如何隱藏基類的方法?02Sealed關(guān)鍵字sealed關(guān)鍵字修飾類sealed關(guān)鍵字修飾類在C#中,使用sealed關(guān)鍵字修飾的類不可以被繼承,也就是不能派生子類,這樣的類通常被稱為密封類。接下來通過一個簡單的例子來演示sealed關(guān)鍵字的使用。namespaceProgram05{sealedclassAnimal{publicvoidShout(){Console.WriteLine("動物叫");}}classDog:Animal{publicvoidRun(){Console.WriteLine("狗在跑");}}}sealed關(guān)鍵字修飾類sealed關(guān)鍵字修飾類程序編譯報錯,如下圖所示。由于Animal類被sealed關(guān)鍵字修飾,因此當(dāng)Dog類繼承Animal類時,編譯器中會出現(xiàn)“Dog”:無法從密封類型“Animal派生”的錯誤。由此可見,被sealed關(guān)鍵字修飾的類不能被其他類繼承。sealed關(guān)鍵字修飾類sealed關(guān)鍵字修飾類當(dāng)一個類中的方法被sealed關(guān)鍵字修飾后,這個類的子類將不能重寫該方法。接下來通過一個案例來演示被sealed關(guān)鍵字修飾的方法。sealed關(guān)鍵字修飾類sealed關(guān)鍵字修飾類namespaceProgram06{......classBlackDog:Dog{publicoverridevoidShout(){Console.WriteLine("黑色狗的叫聲");}}classProgram{staticvoidMain(string[]args){Dogdog=newDog();//創(chuàng)建Dog類對象dog.Shout();Console.ReadKey();}}}namespaceProgram06{classAnimal{publicvirtualvoidShout(){Console.WriteLine("動物的叫聲");}}classDog:Animal{publicsealedoverridevoidShout(){Console.WriteLine("狗的叫聲");}}......}sealed關(guān)鍵字修飾類sealed關(guān)鍵字修飾類程序編譯報錯,如下圖所示。此時編譯器已報錯,報錯信息為“BlackDog.Shout()”:繼承成員“Dog.Shout()”是密封的,無法進(jìn)行重寫。說明Dog類中被sealed關(guān)鍵字修飾的Shout()方法不能在BlackDog類中被重寫。思考題使用sealed修飾的類和方法有什么特點(diǎn)?03多態(tài)多態(tài)多態(tài)在設(shè)計(jì)一個方法時,通常希望該方法具備一定的通用性。例如要實(shí)現(xiàn)一個動物叫的方法,由于每種動物的叫聲是不同的,因此可以在方法中接收一個動物類型的參數(shù),當(dāng)傳入貓類對象時就發(fā)出貓類的叫聲,傳入犬類對象時就發(fā)出犬類的叫聲。此時,可以通過多態(tài)的方式來實(shí)現(xiàn)這種功能。所謂多態(tài)就是當(dāng)調(diào)用同一個方法時,由于傳入的參數(shù)類型不同而導(dǎo)致執(zhí)行效果各異的現(xiàn)象。重寫父類方法重寫父類方法在繼承關(guān)系中,子類會自動繼承父類中的方法,但有時父類的方法不能滿足子類的需求,那么可以對父類的方法進(jìn)行重寫。當(dāng)重寫父類的方法時,要求子類的方法名、參數(shù)類型和參數(shù)個數(shù)必須與父類方法相同,而且父類方法必須使用virtual關(guān)鍵字修飾,子類方法必須使用override關(guān)鍵字修飾。上一節(jié)案例中,Dog類從Animal類繼承了Shout()方法,該方法在被調(diào)用時會打印“動物叫”。這明顯不能描述一種具體動物的叫聲,Dog類對象表示犬類,發(fā)出的叫聲應(yīng)該是汪汪。為了解決這個問題,可以在Dog類中重寫父類Animal中的Shout()方法,具體代碼如下所示。重寫父類方法重寫父類方法namespaceProgram07{classAnimal{publicvirtualvoidShout(){Console.WriteLine("動物發(fā)出叫聲");}}classDog:Animal{publicoverridevoidShout(){Console.WriteLine("汪汪......");}}......}使用virtual關(guān)鍵字表示可被子類重寫重寫父類的方法重寫父類方法重寫父類方法namespaceProgram07{......classProgram{staticvoidMain(string[]args){Dogdog=newDog();//創(chuàng)建Dog類的實(shí)例對象dog.Shout();//調(diào)用dog重寫的shout()方法Console.ReadKey();}}}重寫父類方法重寫父類方法運(yùn)行結(jié)果如下圖所示。根據(jù)運(yùn)行結(jié)果可知,在調(diào)用Dog類對象的Shout()方法時,程序只會調(diào)用子類重寫的Shout()方法,并不會調(diào)用父類的Shout()方法。注意:子類重寫父類方法時,不能使用比父類中被重寫的方法更嚴(yán)格的訪問權(quán)限,如父類方法的訪問修飾符是public,子類中的方法的修飾符就不能是private。多態(tài)的實(shí)現(xiàn)多態(tài)的實(shí)現(xiàn)在C#中為了實(shí)現(xiàn)多態(tài),允許使用一個父類類型的變量來引用一個子類對象,根據(jù)被引用子類對象特征的不同,得到不同的運(yùn)行結(jié)果。而實(shí)現(xiàn)多態(tài)的方式有多種,接下來通過重寫的方式來演示如何實(shí)現(xiàn)多態(tài)。namespaceProgram08{classAnimal{publicvirtualvoidShout(){Console.WriteLine("動物叫......");}}classCat:Animal{publicoverridevoidShout(){Console.WriteLine("喵喵......");}}......}多態(tài)的實(shí)現(xiàn)namespaceProgram08{......classDog:Animal{publicoverridevoidShout(){Console.WriteLine("汪汪......");}}classProgram{staticvoidMain(string[]args){Animalan1=newCat();//創(chuàng)建Cat對象,使用Animal類型的變量an1引用Animalan2=newDog();//創(chuàng)建Dog對象,使用Animal類型的變量an2引用animalShout(an1);//調(diào)用animalShout()方法,將an1作為參數(shù)傳入animalShout(an2);//調(diào)用animalShout()方法,將an2作為參數(shù)傳入Console.ReadKey();}publicstaticvoidanimalShout(Animalan){//接收一個Animal類型的參數(shù)an.Shout();//調(diào)用實(shí)際參數(shù)的shout()方法}}}多態(tài)的實(shí)現(xiàn)多態(tài)的實(shí)現(xiàn)多態(tài)的實(shí)現(xiàn)運(yùn)行結(jié)果如下圖所示。上述示例中實(shí)現(xiàn)了父類類型變量引用了不同子類的對象,調(diào)用animalShout()方法時,將父類引用的兩個不同子類對象分別傳入,運(yùn)行結(jié)果中輸出了“喵喵……”與“汪汪……”。由此可見,多態(tài)不僅解決了方法同名的問題,而且還使程序變得更加靈活,從而有效提高程序的可擴(kuò)展性和可維護(hù)性。base關(guān)鍵字base關(guān)鍵字當(dāng)子類重寫父類的方法后,子類對象將無法直接訪問父類被重寫的方法。C#中提供了一個base關(guān)鍵字專門用于在子類中訪問父類的成員,例如訪問父類的字段、方法和構(gòu)造方法等。接下來分兩種情況來演示base關(guān)鍵字的具體用法。1、調(diào)用父類的字段和方法,具體語法格式如下:base.字段名base.方法名([參數(shù)1,參數(shù)2,…])為了讓初學(xué)者更好的學(xué)習(xí)base關(guān)鍵字的使用,接下來通過一個案例來演示如何訪問父類的字段和方法,具體代碼如下所示。base關(guān)鍵字namespaceProgram09{classAnimal{publicstringname="動物類";publicvirtualvoidShout(){Console.WriteLine("動物的叫聲");}}classDog:Animal{publicoverridevoidShout(){//重寫父類的shout()方法base.Shout();//訪問父類的成員方法}publicvoidPrintName(){//定義打印name的方法Console.WriteLine("name="+);//訪問父類的成員變量}}......}base關(guān)鍵字Base訪問父類的方法Base訪問父類的字段base關(guān)鍵字base關(guān)鍵字運(yùn)行結(jié)果如下圖所示。由運(yùn)行結(jié)果可知,子類通過base關(guān)鍵字可以成功訪問父類中的字段和方法。base關(guān)鍵字base關(guān)鍵字2、調(diào)用父類的構(gòu)造方法,具體語法格式如下:classA{//父類}classB:A{//子類publicB():base(){//使用base關(guān)鍵字調(diào)用父類默認(rèn)構(gòu)造方法}}根據(jù)前面的學(xué)習(xí)可知,繼承關(guān)系中,在創(chuàng)建子類的對象時,父類的構(gòu)造方法是默認(rèn)執(zhí)行的。接下來通過一個案例來演示base關(guān)鍵字如何訪問父類的有參構(gòu)造方法,具體代碼如下所示。base關(guān)鍵字namespaceProgram10{classAnimal{publicAnimal(){Console.WriteLine("默認(rèn)構(gòu)造方法");}publicAnimal(stringname){//定義Animal類的有參構(gòu)造方法Console.WriteLine("Animal類的有參構(gòu)造方法被"+name);}}classDog:Animal{publicDog(stringname):base(name){//定義Dog類的有參構(gòu)造方法Console.WriteLine("Dog類的有參構(gòu)造方法被"+name);}}......}base關(guān)鍵字Base訪問父類的有參構(gòu)造方法base關(guān)鍵字base關(guān)鍵字namespaceProgram10{......classProgram{staticvoidMain(string[]args){Dogdog=newDog("執(zhí)行");//實(shí)例化子類Console.ReadKey();}}}base關(guān)鍵字base關(guān)鍵字運(yùn)行結(jié)果如下圖所示。由運(yùn)行結(jié)果可知,通過base關(guān)鍵字可以調(diào)用父類的構(gòu)造方法。里氏轉(zhuǎn)換原則里氏轉(zhuǎn)換原則在現(xiàn)實(shí)生活中經(jīng)常把某事物看作某類型,例如可以將貓和狗看作動物類型。在程序中也經(jīng)常將子類對象當(dāng)作父類類型來使用,這時子類與父類之間需要進(jìn)行類型轉(zhuǎn)換,在轉(zhuǎn)換的過程中需要遵循里氏轉(zhuǎn)換原則。接下來通過兩種情況來說明一下里氏轉(zhuǎn)換原則。1、子類對象可以直接賦值給父類變量,具體代碼如下:Animalan1=newCat();//將Cat類的對象賦值給Animal類的變量Animalan2=newDog();//將Dog類的對象賦值給Animal類的變量上述示例中,Cat類與Dog類都是Animal類的子類,在實(shí)例化對象時可以將子類對象賦值給父類變量。里氏轉(zhuǎn)換原則接下來通過一個具體的案例來演示這種情況,具體代碼如下所示。namespaceProgram11{classAnimal{//使用virtual關(guān)鍵字使該方法在子類中可被重寫publicvirtualvoidShout(){Console.WriteLine("Animal類中Shout()方法被執(zhí)行");}}classDog:Animal{//使用override關(guān)鍵字重寫父類Shout()方法publicoverridevoidShout(){Console.WriteLine("Dog類中的Shout()方法被執(zhí)行");}}......}里氏轉(zhuǎn)換原則里氏轉(zhuǎn)換原則里氏轉(zhuǎn)換原則namespaceProgram11{......classProgram{staticvoidMain(string[]args){Animalanimal=newDog();//子類Dog的實(shí)例直接賦值給父類型的變量animal.Shout();//調(diào)用子類Dog重寫的Shout()方法animal=newCat();//子類Cat的實(shí)例直接賦值給父類型的變量animal.Shout();//調(diào)用子類Cat重寫的Shout()方法Console.ReadKey();}}}做了一次里氏轉(zhuǎn)換,子類Dog直接賦值給了父類,并通過父類變量調(diào)用了子類的方法做了一次里氏轉(zhuǎn)換,子類Cat直接賦值給了父類,并通過父類變量調(diào)用了子類的方法里氏轉(zhuǎn)換原則里氏轉(zhuǎn)換原則運(yùn)行結(jié)果如下圖所示。由運(yùn)行結(jié)果可知,子類對象可以直接賦值給父類變量,并通過父類變量可以調(diào)用子類中的方法。里氏轉(zhuǎn)換原則里氏轉(zhuǎn)換原則2、父類對象賦值給子類變量時需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換在上一個案例的講解中將子類對象賦值給父類變量時,直接賦值即可,但是將父類對象賦值給子類變量時需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。例如將Animal類的對象animal賦值給Dog類型變量時,需要在animal對象前面添加括號,括號中指定將父類類型轉(zhuǎn)換為子類類型。接下來通過一個案例來演示將父類對象賦值給子類變量,具體代碼如下所示。里氏轉(zhuǎn)換原則namespaceProgram12{classAnimal{publicvoidShout(){Console.WriteLine("Animal類中Shout()方法被調(diào)用");}}classDog:Animal{publicvoidRun(){Console.WriteLine("Dog類中的Run()方法被調(diào)用");}}......}里氏轉(zhuǎn)換原則里氏轉(zhuǎn)換原則namespaceProgram12{......classProgram{staticvoidMain(string[]args){Animalanimal=newDog();//子類Dog指向父類Animalanimal.Shout();Dogdog=(Dog)animal;//父類對象animal強(qiáng)制轉(zhuǎn)換為子類類型dog.Run();Console.ReadKey();}}}里氏轉(zhuǎn)換原則父類對象里氏轉(zhuǎn)換為子類,需要將父類對象強(qiáng)制轉(zhuǎn)換為子類類型里氏轉(zhuǎn)換原則里氏轉(zhuǎn)換原則運(yùn)行結(jié)果如下圖所示。由運(yùn)行結(jié)果可知,在繼承關(guān)系中,當(dāng)子類對象指向父類變量時,父類變量也可以通過強(qiáng)制類型轉(zhuǎn)換的方式指向子類變量。Object類在C#中提供了一個Object類,它是所有類的父類,也就是每個類都直接或間接繼承自該類,接下來通過一個例子來演示Object類是所有類的父類,具體代碼如下所示。namespaceProgram14{classAnimal{voidShout(){//定義動物叫的方法Console.WriteLine("動物叫");}}classProgram{staticvoidMain(string[]args){Animalanimal=newAnimal();//創(chuàng)建Animal類的對象Console.WriteLine(animal.ToString());//調(diào)用ToString()方法并打印Console.ReadKey();}}}Object類調(diào)用了Object的ToString()方法Object類Object類運(yùn)行結(jié)果如下圖所示。由運(yùn)行結(jié)果可知,程序成功的調(diào)用了Animal類中的ToString()方法,雖然Animal類中沒有定義該方法,但是程序并沒有報錯。這是因?yàn)锳nimal類默認(rèn)繼承自O(shè)bject類,而Object類中存在ToString()方法,在該方法中輸出了對象的基本信息。Object類在實(shí)際開發(fā)中,通常希望對象的ToString()方法返回的不僅僅是基本信息,還有一些特有的信息,此時可以通過重寫Object類的ToString()方法來實(shí)現(xiàn)。接下來通過一個案例來演示通過重寫Object類的ToString()方法返回一些特有的信息,具體代碼如下所示。namespaceProgram15{classAnimal{publicoverridestringToString(){//重寫Object類的ToString()方法return"動物叫";}}classProgram{staticvoidMain(string[]args){Animalanimal=newAnimal();//創(chuàng)建Animal對象Console.WriteLine(animal.ToString());//打印animal的ToString()方法的返回值Console.ReadKey();}}}Object類重寫了Object類的ToString()方法Object類Object類運(yùn)行結(jié)果如下圖所示。由運(yùn)行結(jié)果可知,通過在Animal類中重寫Object類中的ToString()方法來打印“動物叫”信息。思考題1.方法的重寫需要滿足什么條件?2.可以通過哪些方式實(shí)現(xiàn)多態(tài)?04抽象類和接口抽象類和接口抽象類和接口由abstract關(guān)鍵字修飾的類為抽象類,抽象類中的方法不用寫方法體,抽象類中可以有抽象方法,也可以有不是抽象的方法。然而接口必須使用interface關(guān)鍵字來聲明,接口中的方法都為抽象方法,抽象方法與接口是面向?qū)ο笾斜仨氁獙W(xué)習(xí)的內(nèi)容。抽象類抽象類當(dāng)定義一個類時,常常需要定義一些方法來描述該類的行為特征,但有時這些方法的實(shí)現(xiàn)方式是無法確定的。例如在前面小節(jié)中定義Animal類時,Shout()方法用于表示動物的叫聲,但是針對不同的動物,叫聲也是不同的,因此在Shout()方法中無法準(zhǔn)確地描述具體是哪種動物的叫聲。針對上面描述的情況,C#允許在定義方法時不寫方法體,不包含方法體的方法為抽象方法,抽象方法必須使用abstract關(guān)鍵字來修飾,具體示例如下:abstractvoidShout();//定義抽象方法Shout()抽象類抽象類當(dāng)一個類中包含了抽象方法,該類也必須使用abstract關(guān)鍵字來修飾,使用abstract關(guān)鍵字修飾的類為抽象類,具體示例如下://定義抽象類AnimalabstractclassAnimal{abstractvoidShout();//定義抽象方法Shout()}需要注意的是,包含抽象方法的類必須聲明為抽象類,但是抽象類可以不包含抽象方法。另外,抽象類是不可以被實(shí)例化的,因?yàn)槌橄箢愔杏锌赡馨橄蠓椒?,抽象方法是沒有方法體的,不可以被調(diào)用。如果想調(diào)用抽象類中定義的方法,則需要創(chuàng)建一個子類,在子類中實(shí)現(xiàn)抽象類中的抽象方法。抽象類抽象類接下來通過一個案例來演示如何實(shí)現(xiàn)抽象類中的方法,具體示例如下:namespaceProgram16{abstractclassAnimal{publicabstractvoidShout();//定義抽象方法Shout()}classDog:Animal{//實(shí)現(xiàn)抽象方法Shout()publicoverridevoidShout(){Console.WriteLine("汪汪......");}}......}通過override實(shí)現(xiàn)了父類的抽象方法抽象類抽象類namespaceProgram16{......classProgram{staticvoidMain(string[]args){Dogdog=newDog();//創(chuàng)建Dog類的實(shí)例對象dog.Shout();Console.ReadKey();}}}抽象類抽象類運(yùn)行結(jié)果如下圖所示。由運(yùn)行結(jié)果可知,子類Dog通過override關(guān)鍵字實(shí)現(xiàn)了父類Animal中的抽象方法后,可以進(jìn)行正常的實(shí)例化,并通過實(shí)例化對象調(diào)用子類中重寫的Shout()方法。接口接口如果一個抽象類中的所有方法都是抽象的,則可以將這個類用另外一種方式來定義,即接口。在定義接口時,需要使用interface關(guān)鍵字來聲明,具體示例如下:interfaceAnimal{voidBreathe();//定義抽象方法voidRun();//定義抽象方法}由于接口中的方法都是抽象方法,因此不能通過實(shí)例化對象的方式來調(diào)用接口中的方法。此時需要定義一個類來實(shí)現(xiàn)接口中的所有方法。接下來通過一個案例來演示如何調(diào)用接口中的抽象方法,具體示例如下:接口接口namespaceProgram17{interfaceAnimal{voidBreathe();voidRun();}classDog:Animal{//實(shí)現(xiàn)Breathe()方法publicvoidBreathe(){Console.WriteLine("狗在呼吸");}//實(shí)現(xiàn)Run()方法publicvoidRun(){Console.WriteLine("狗在跑");}}......}接口的實(shí)現(xiàn)接口接口namespaceProgram17{......classProgram{staticvoidMain(string[]args){Dogdog=newDog();//創(chuàng)建Dog類的實(shí)例對象dog.Breathe();//調(diào)用Dog類的Breathe()方法dog.Run();//調(diào)用Dog類的Run()方法Console.ReadKey();}}}接口接口運(yùn)行結(jié)果如下圖所示。由運(yùn)行結(jié)果可知,當(dāng)調(diào)用Dog類中實(shí)現(xiàn)的Animal接口中的方法時,程序便會在控制臺中輸出“狗在呼吸”與“狗在跑”的信息。接口接口為了加深初學(xué)者對接口的認(rèn)識,接下來對接口的特點(diǎn)進(jìn)行歸納,具體如下:

1.接口中的所有方法都是抽象的,因此接口不能被實(shí)例化。

2.一個類可以實(shí)現(xiàn)多個接口,被實(shí)現(xiàn)的多個接口之間要用逗號隔開,具體示例如下:interfaceRun{程序代碼......}interfaceFly{程序代碼......}classBird:Run,Fly{程序代碼......}接口接口

3.一個接口可以繼承多個接口,接口之間用逗號隔開,具體示例如下:interfaceRunning{程序代碼......}interfaceFlying{程序代碼......}InterfaceEating:Running,Flying{程序代碼......}思考題簡述抽象類和接口的異同點(diǎn)。05異常什么是異常什么是異常異常是錯誤發(fā)生的信號,一旦程序出錯就會產(chǎn)生一個異常,如果該異常沒有被應(yīng)用程序處理,那么該異常就會被拋出,程序的執(zhí)行也會隨之終止。為了不讓程序終止,我們需要知道什么是異常、如何捕獲異常、如何拋出異常等信息。盡管人人希望自己身體健康,處理的事情都能順利進(jìn)行,但在實(shí)際生活中總會遇到各種狀況,比如感冒發(fā)燒,工作時電腦藍(lán)屏、死機(jī)等等。程序運(yùn)行過程中,也會發(fā)生這種非正常狀況,比如程序運(yùn)行時磁盤空間不足,網(wǎng)絡(luò)連接中斷,被操作的文件不存在。針對這種情況,C#程序引入了異常處理機(jī)制,通過異常處理機(jī)制對程序運(yùn)行時出現(xiàn)的各種問題進(jìn)行處理。什么是異常什么是異常接下來通過一個案例來演示什么是異常,具體示例如下:namespaceProgram19{classProgram{staticvoidMain(string[]args){intnum1=10;intnum2=0;intnum3=num1/num2;//除數(shù)為0,將拋出異常Console.WriteLine("num3="+num3);Console.ReadKey();}}}什么是異常什么是異常運(yùn)行程序時,程序出現(xiàn)異常,具體示例如下:由上圖可知,程序中出現(xiàn)了未處理的異常DivideByZeroException,這個異常就是由除數(shù)為0引起的。什么是異常什么是異常DivideByZeroException異常只是異常類中的一種,C#中提供了大量的異常類,這些類都繼承自Exception類,接下來通過一張圖來展示Exception類的繼承體系,如下圖所示。什么是異常什么是異常為了更好的展示異常信息,每個異常對象中都包含一些只讀屬性,這些屬性可以描述異常的信息,通過這些屬性可以更準(zhǔn)確地找到異常出現(xiàn)的原因,異常對象的常用屬性如下表所示。屬性類型描述Messagestring此屬性含有解釋異常原因的消息StackTracestring此屬性含有描述異常發(fā)生在位置信息InnerExceptionException如果當(dāng)前異常是由另一個異常引起的,此屬性包含前一個異常的引用HelpLinkstring此屬性為異常原因信息提供URN或者URLSourcestring此屬性含有異常起源所在的程序集的名稱try…catch和finallytry…catch和finally如果程序發(fā)生了異常并立即終止,無法繼續(xù)向下執(zhí)行。為了解決這樣的問題,C#程序中提供了一種對異常進(jìn)行處理的方式——異常捕獲。異常捕獲通常使用try…catch語句,具體語法格式如下:try{//程序代碼塊}catch(ExceptionTypee){//可以是Exception類及其子類//對異常的處理}try…catch和finallytry…catch和finallyC#中的catch代碼塊有多種形式,不同形式的代碼塊用于處理不同級別的異常,具體如下:

1. 一般的catch代碼塊

catch后面沒有任何內(nèi)容,可以匹配try代碼塊中任意類型的異常,具體語法格式如下:catch{//對異常的處理}try…catch和finallytry…catch和finally2.特定catch代碼塊catch后帶有異常類型,它可以匹配該類型的所有異常,具體語法格式如下:

catch(Exceptiontype){//對異常的處理}3.特定對象的catch代碼塊catch后不僅帶有異常類型,還帶有異常對象,通過異常對象可以獲取異常信息,具體語法格式如下:

catch(ExceptiontypeInstID){//對異常的處理}try…catch和finallytry…catch和finally使用try...catch語句對案例中出現(xiàn)的異常進(jìn)行捕獲,具體代碼如下:

namespaceProgram20{classProgram{staticvoidMain(string[]args){try{......}catch(DivideByZeroExceptione){Console.WriteLine("已處理異常信息:"+e.Message);Console.ReadKey();}catch(SystemException){Console.WriteLine("已處理系統(tǒng)異常");}catch{Console.WriteLine("已處理異常");}}}}try…catch和finallytry…catch和finally運(yùn)行結(jié)果如下圖所示。由運(yùn)行結(jié)果可知,當(dāng)try代碼塊中的代碼拋出異常之后,被第一個catch代碼塊捕獲,并執(zhí)行該代碼塊中的代碼,異常不再被拋出。在程序中,如果希望有些語句在程序無論是否發(fā)生異常都要執(zhí)行,此時就可以在try…catch語句后加一個finally代碼塊。注意:在程序中使用異常語句時,try代碼塊是必須有的,而catch代碼塊和finally代碼塊必須要有一個,否則會出現(xiàn)編譯錯誤。throw關(guān)鍵字throw關(guān)鍵字當(dāng)程序中出現(xiàn)異常時,不僅可以通過try…catch代碼塊捕獲異常,還可以使用throw關(guān)鍵字拋出異常對象。拋出的異常對象可以被上層的try…catch代碼塊捕獲處理,也可以不作處理。接下來通過實(shí)例化一個異常對象來演示throw關(guān)鍵字的使用,具體代碼如下所示。namespaceProgram22{classProgram{staticvoidMain(string[]args){//創(chuàng)建一個異常對象并拋出thrownewException("這是一個異常");}}}throw關(guān)鍵字throw關(guān)鍵字拋出異常如下圖所示。由上圖可知,程序拋出了一個未處理的異常,這是因?yàn)槌绦蛑械膖hrow關(guān)鍵字不會對異常進(jìn)行處理,只會拋出一個異常對象。throw關(guān)鍵字經(jīng)常被用于將異常拋給上層代碼處理,如果一直沒有被處理,最后就會被操作系統(tǒng)捕捉到,而try…catch代碼塊會將程序拋出的異常直接進(jìn)行處理。在實(shí)際開發(fā)中,可以將throw和try…catch配合使用。06命名空間和程序集命名空間命名空間C#中引入了命名空間的概念,可以將命名空間理解為程序定義的一個目錄,使用命名空間可以有效避免類名沖突的問題,定義命名空間的示例代碼。namespaceExample{ClassAnimal{voidShout(){ Console.WriteLine("動物的叫聲");}}}namespace表示命名空間的關(guān)鍵字,Example表示命名空間的名稱命名空間命名空間在實(shí)例化對象、調(diào)用方法、屬性時都要使用“命名空間名.成員”的方式來引用,具體示例代碼如下:staticvoidMain(string[]args){Example.Animalanimal=newExample.Animal();Console.ReadKey();}Example為命名空間名,Animal為命名空間下的成員命名空間命名空間接下來通過一段代碼來使用using關(guān)鍵字引入Example命名空間,具體代碼如下所示:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingExample;//引用命名空間namespaceTest{classTest{staticvoidMain(string[]args){Animal=newAnimal();Console.ReadKey();}}}程序集程序集所謂的程序集就是包含一個或多個類型的定義文件和資源文件的集合,該程序集中的文件可以被其他程序使用。程序集文件可分為四個部分,分別是程序集清單、元數(shù)據(jù)、CIL、資源集,具體說明如下:程序集清單:包含描述該程序集中各元素彼此如何關(guān)聯(lián)的數(shù)據(jù)集合,還包含指定該程序集的版本信息、安全標(biāo)識所需的元數(shù)據(jù)、定義該程序集的范圍以及解析對資源和類應(yīng)用所需的元數(shù)據(jù)。元數(shù)據(jù):提供有關(guān)程序集中定義的類型信息,包括類型的名稱、基類和類型所實(shí)現(xiàn)的接口等。CIL:程序類型中所有的中間代碼。資源集:諸如位圖、指針、靜態(tài)文本等。為了讓初學(xué)者更好的學(xué)習(xí)如何使用程序集,接下來通過具體步驟演示程序集的生成過程以及如何引入程序集。練習(xí)?本章練習(xí)如何使用base關(guān)鍵字?如何實(shí)現(xiàn)接口??預(yù)習(xí)練習(xí)非泛型集合包括哪些?泛型集合包括哪些?本章小節(jié)本章詳細(xì)介紹了面向?qū)ο蟮母呒壷R,包括:詳細(xì)講解了類的繼承、多態(tài)、抽象類和接口等面向?qū)ο蟮暮诵膬?nèi)容;介紹了sealed關(guān)鍵字、異常、命名空間和程序集的使用;熟練掌握本章內(nèi)容,能夠更快速、更高效地學(xué)習(xí)其他章節(jié)。THANKYOU深圳市信息職業(yè)技術(shù)學(xué)院——集合1.1系統(tǒng)技術(shù)棧介紹89非泛型集合泛型集合集合概述知識回顧類的繼承多態(tài)抽象類和接口Sealed關(guān)鍵字異常命名空間和程序集學(xué)習(xí)目標(biāo)通過本節(jié)學(xué)習(xí)可以:重點(diǎn)學(xué)習(xí)ArrayList集合重點(diǎn)學(xué)習(xí)Hashtable集合掌握List<T>泛型集合掌握Dictionary<TKey,TValue>泛型集合掌握自定義泛型了解集合概述01集合概述集合概述集合概述為了保存這些數(shù)目不確定的對象,C#中提供了一系列特殊的類,這些類可以存儲任意類型的對象,并且長度可變,統(tǒng)稱為集合。C#中集合可分為泛型集合和非泛型集合,二者均間接實(shí)現(xiàn)了IEnumerable接口。泛型集合位于System.Collections.Generic命名空間,它只能存儲同一種類型的對象,其中最常用的是List<T>泛型集合和Dictionary<TKey,TValue>泛型集合。非泛型集合位于System.Collections命名空間,它可以存儲多種類型的對象,其中最常用的是ArrayList集合和Hashtable集合。集合概述C#中提供了豐富的集合類。為了便于初學(xué)者對集合進(jìn)行系統(tǒng)地學(xué)習(xí),接下來通過一個圖例來描述整個集合類的繼承體系,如下圖所示。上圖中列出了程序中常用的一些集合類。其中,虛線框里填寫的都是接口類型,而實(shí)線框里填寫的都是具體的實(shí)現(xiàn)類。集合概述02非泛型集合思考題ArrayList集合常用方法包括哪些?Arraylist集合ArrayList集合就像是一個收納盒,它可以容納不同類型的對象。例如,可以將int、string、object等類型的對象同時加入到ArrayList集合中。ArrayList集合提供了一系列方法,接下來通過下表來列舉ArrayList集合的常用方法。方法說明intAdd(objectvalue)將元素添加到ArrayList集合voidAddRange(ICollectionc)將集合或者數(shù)組添加到ArrayList集合voidClear()從ArrayList中移除所有元素boolContains(objectitem)判斷某元素是否在ArrayList中intIndexOf(objectvalue)查找指定元素,并返回該元素在ArrayList中第一個匹配項(xiàng)的索引voidInsert(intindex,objectvalue)將元素插入ArrayList的指定索引處intLastIndexOf(objectvalue)查找指定元素,并返回該元素在ArrayList中最后一個匹配項(xiàng)的索引voidRemove(objectobj)從ArrayList中移除指定元素的第一個匹配項(xiàng)voidRemoveAt(intindex);從ArrayList中移除指定索引處的元素voidReverse()將整個ArrayList中元素的順序反轉(zhuǎn)voidSort()對整個ArrayList中的元素進(jìn)行排序ArrayListArrayList集合ArrayList集合的常用方法可以對集合中的元素進(jìn)行添加、刪除、修改和查詢等操作,具體如下:添加元素調(diào)用ArrayList對象的Add()方法、AddRange()方法、Insert()方法來添加元素,具體示例代碼如下:ArrayListarr1=newArrayList();//創(chuàng)建ArrayList集合對象arr1//使用不同方法向集合添加多個元素

arr1.Add(134);arr1.AddRange(newArrayList(){"張三","李四"});arr1.Insert(2,'a');添加元素ArrayList集合需要注意的是,集合的長度就是元素的個數(shù),集合的容量是隨集合長度變化而變化的。如果集合的長度在1~4之間,容量的值就是4。如果集合的實(shí)際長度在5~8之間,那容量的值就變?yōu)?。以此類推,ArrayList的容量值總是以4為基本單位遞增或遞減。使用Insert()方法向集合中添加元素時,允許插入元素的索引值比集合的最大索引值大1,如果元素的索引值超過集合的最大索引值且范圍在1以上,編譯時就會報異常。添加元素ArrayList集合2.刪除元素調(diào)用ArrayList的Remove()方法或RemoveAt()方法或Clear()方法刪除元素,具體示例代碼如下:ArrayListarr1=newArrayList();//將新建的集合對象添加到arr1集合的末尾

arr1.AddRange(newArrayList(){"張三","李四","王五"});arr1.Remove("張三");arr1.RemoveAt(0);arr1.Clear();刪除元素從集合中移除指定元素的第一個匹配項(xiàng)從集合中移除指定索引位置的元素刪除集合中所有的元素ArrayList集合3.修改元素通過集合中的索引修改ArrayList集合中的元素,具體示例代碼如下:

//創(chuàng)建ArrayList集合對象

ArrayListarr1=newArrayList(newArrayList(){"張三","李四","王五"});Console.WriteLine("修改前集合中的元素:");ErgoArr(arr1);arr1[0]=1;arr1[1]=2;arr1[2]=3;Console.WriteLine();Console.WriteLine("修改后集合中的元素:");ErgoArr(arr1);Console.ReadKey();修改元素通過集合的索引修改arr1中的元素,由原來的“張三”、“李四”、“王五”改成了1、2、3ArrayList集合4.查詢元素調(diào)用IndexOf()方法或LastIndexOf()方法查詢指定元素的索引,調(diào)用Contains()方法判斷集合中是否存在某個元素。具體示例代碼如下:

ArrayListarr1=newArrayList(newArrayList(){1,2,3,1});ErgoArr(arr1);

intindex=arr1.IndexOf(1);Console.WriteLine("集合中第一個1的索引值為:"+index);

intlastIndex=arr1.LastIndexOf(1);Console.WriteLine("集合中最后一個1的索引值為:"+lastIndex);boolresult=arr1.Contains(2);//判斷某元素是否在集合中Console.WriteLine("集合中是否包含元素2:"+result);arr1.Sort();//對集合中的元素按照默認(rèn)的順序進(jìn)行排序ErgoArr(arr1);

查詢元素查找指定元素,并返回該元素在集合中第一個匹配項(xiàng)的索引查找指定元素,并返回該元素在集合最后一個匹配項(xiàng)的索引ArrayList集合多學(xué)一招:通過foreach循環(huán)遍歷ArrayList集合。具體語法格式如下:foreach(varitemincollection){

執(zhí)行語句;}

上述語法格式中,item變量用于存儲每次遍歷的元素,默認(rèn)情況下item為var類型,in為關(guān)鍵字,collection表示被遍歷的集合。需要注意的是,foreach循環(huán)只能對遍歷的元素進(jìn)行讀操作,而且只能單向遍歷,也就是一個元素在整個foreach循環(huán)中只能被訪問一次,因此在遍歷集合中的元素時可以優(yōu)先選擇foreach循環(huán),如果需要修改或多次訪問集合中某個元素時,考慮使用for循環(huán)。多學(xué)一招思考題Hashtable集合常用方法包括哪些?hashtable集合C#中提供了一個Hashtable集合,該集合又被稱為鍵值對集合,所謂鍵就類似于字典中的目錄,值就類似于字典中的具體漢字信息,鍵與值是一一對應(yīng)的關(guān)系,通過唯一的鍵能找到對應(yīng)的值,因此Hashtable集合的這種特性大大提高了查詢元素的效率。接下來通過一張表來列舉Hashtable集合中的常用方法。方法說明voidAdd(objectkey,objectvalue)將帶有指定鍵和值的元素添加到Hashtable集合中voidClear()從Hashtable集合中移除所有元素boolContains(objectkey)判斷Hashtable集合中是否包含指定的鍵boolContainsValue(objectvalue)判斷Hashtable集合是否包含指定的值voidRemove(objectkey)從Hashtable集合中移除帶有指定鍵的元素Hashtable集合hashtable集合接下來通過一個案例來演示如何使用Hashtable集合中的常用方法,具體示例代碼如下:Hashtableht=newHashtable();//創(chuàng)建Hashtable集合對象htht.Add(1,"張三");ht.Add('A',"李四");ht.Add("BB","王五");ErgoHash(ht);ht.Remove("BB");

ErgoHash(ht);ht.Clear();

Console.WriteLine("集合ht中的元素個數(shù):"+ht.Count);Console.ReadKey();Hashtable集合調(diào)用Hashtable集合的Add()方法添加元素移除鍵為"BB"的元素移除Hashtable集合中所有元素hashtable集合在遍歷Hashtable集合時,除了可以通過鍵來獲取對應(yīng)的值以外,還可以直接遍歷集合中的值或集合中的對象。接下來通過一個例子來演示這兩種遍歷方式,具體示例代碼如下:Hashtableht=newHashtable();//調(diào)用Hashtable的Add()方法來添加元素

ht.Add(1,"張三");ht.Add(2,"李四");ht.Add(3,"王五");//使用foreach語句來循環(huán)遍歷集合中的值

foreach(objectvalueinht.Values){Console.WriteLine("當(dāng)前遍歷到的值為:"+value);}Console.WriteLine();Hashtable集合hashtable集合//使用foreach語句來循環(huán)遍歷集合對象本身foreach(DictionaryEntrydicEninht){Console.Write(dicEn.Key+":"+dicEn.Value+"\n");}Console.ReadKey();運(yùn)行結(jié)果如下圖所示:Hashtable集合非泛型集合

publicclassstudent{publicintNumber{get;set;}publicstringName{get;set;}publicboolSex{get;set;}publicstudent(int_number,string_name,bool_sex){Number=_number;Name=_name;Sex=_sex;}publicoverridestringToString(){returnstring.Format("序號:{0},姓名:{1},性別:{2}",Number.ToString(),Name,Sex?"男":"女");}}

ArrayListarrayStudents=newArrayList();

privatevoidButton_Click(objectsender,RoutedEventArgse){addData0();showExemple0();}

privatevoidaddData0(){arrayStudents.Add(newstudent(1,"小顆豆一",true));arrayStudents.Add(newstudent(3,"小顆豆二",false));arrayStudents.Add(newstudent(5,"小顆豆三",true));arrayStudents.Add(newstudent(2,"小顆豆四",false));arrayStudents.Add(newstudent(4,"小顆豆五",true));arrayStudents.Add(newstudent(6,"小顆豆六",false));arrayStudents.Add("這里冒一個字符串,需要轉(zhuǎn)換,如果這里是值類型還要進(jìn)行裝箱與拆箱,帶來額外的開銷!");}

privatevoidshowExemple0(){richTextBox1.AppendText("--------非泛型數(shù)組的操作(需要強(qiáng)制轉(zhuǎn)換)--------\r\n");foreach(variteminarrayStudents){if(itemisstudent)richTextBox1.AppendText(item.ToString()+"\r\n");elserichTextBox1.AppendText((string)item+"\r\n");}}非泛型集合類在取出值時需要進(jìn)行類型的轉(zhuǎn)換操作,如果加入值類型會引起裝箱和拆箱的操作,這會帶來巨大的性能額外開銷03泛型集合思考題List<T>泛型集合常用方法包括哪些?List<t>泛型集合List<student>listStudnets=newList<student>();

privatevoidButton_Click(objectsender,RoutedEventArgse){addData0();showExemple0();}

privatevoidaddData0(){listStudnets.Add(newstudent(1,"小顆豆一",true));listStudnets.Add(newstudent(3,"小顆豆二",false));listStudnets.Add(newstudent(5,"小顆豆三",true));listStudnets.Add(newstudent(2,"小顆豆四",false));listStudnets.Add(newstudent(4,"小顆豆五",true));listStudnets.Add(newstudent(6,"小顆豆六",false));}

privatevoidshowExemple0(){richTextBox1.AppendText("--------泛型數(shù)組的操作(不需要強(qiáng)制轉(zhuǎn)換)--------\r\n");foreach(variteminlistStudnets){richTextBox1.AppendText(item.ToString()+"\r\n");}}List<t>泛型集合C#提供了一個List<T>泛型集合,該集合不僅具備ArrayList集合的功

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論