C# Ch5面向?qū)ο蟮母呒?jí)程序設(shè)計(jì)_第1頁(yè)
C# Ch5面向?qū)ο蟮母呒?jí)程序設(shè)計(jì)_第2頁(yè)
C# Ch5面向?qū)ο蟮母呒?jí)程序設(shè)計(jì)_第3頁(yè)
C# Ch5面向?qū)ο蟮母呒?jí)程序設(shè)計(jì)_第4頁(yè)
C# Ch5面向?qū)ο蟮母呒?jí)程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩54頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第五章面向?qū)ο蟮母呒?jí)程序設(shè)計(jì)

1.總體要求掌握靜態(tài)類與靜態(tài)類成員的定義與使用。理解類的繼承性與多態(tài)性,掌握其應(yīng)用方法。理解抽象類、接口的概念,掌握抽象類與接口的定義及使用方法。理解嵌套類、分部類和命名空間的概念,掌握嵌套類、分部類和命名空間的使用方法。2.相關(guān)知識(shí)點(diǎn)熟悉C#的結(jié)構(gòu)、類、數(shù)組的區(qū)別。熟悉類和類成員的定義與使用熟悉方法的定義與使用等基本操作。3.學(xué)習(xí)重點(diǎn)靜態(tài)成員與靜態(tài)類類的繼承性與多態(tài)性抽象類與接口定義與使用。4.學(xué)習(xí)難點(diǎn)靜態(tài)成員的作用,靜態(tài)方法和實(shí)例方法的區(qū)別多態(tài)的概念和實(shí)現(xiàn),虛方法和抽象方法的區(qū)別接口的作用和使用,抽象方法和接口的區(qū)別第五章面向?qū)ο蟮母呒?jí)程序設(shè)計(jì)第五章面向?qū)ο蟮母呒?jí)程序設(shè)計(jì)主要內(nèi)容5.1靜態(tài)成員與靜態(tài)類5.2類的繼承性與多態(tài)性5.3抽象類與接口5.4嵌套類、分部類與命名空間5.1靜態(tài)成員與靜態(tài)類

5.1.1靜態(tài)成員5.1.2靜態(tài)構(gòu)造函數(shù)5.1.3靜態(tài)類返回5.1.1靜態(tài)成員

靜態(tài)成員通過static關(guān)鍵字來標(biāo)識(shí),可以是靜態(tài)方法、字段、屬性或事件。靜態(tài)成員與非靜態(tài)成員的不同在于:靜態(tài)成員屬于類,而不屬于類的實(shí)例,因此需要通過類而不是通過類的實(shí)例來訪問;而非靜態(tài)成員則總是與特定的實(shí)例(對(duì)象)相聯(lián)系。在實(shí)際應(yīng)用中,當(dāng)類的成員所引用或操作的信息是關(guān)于類而不是類的實(shí)例時(shí),就應(yīng)該設(shè)置為靜態(tài)成員。例如,想統(tǒng)計(jì)同類對(duì)象的數(shù)量,就可使用靜態(tài)字段和靜態(tài)方法來實(shí)現(xiàn)5.1.1靜態(tài)成員

【實(shí)例5-1】利用靜態(tài)成員統(tǒng)計(jì)人數(shù)。5.1.2靜態(tài)構(gòu)造函數(shù)類的構(gòu)造函數(shù)也可以是靜態(tài)的,靜態(tài)構(gòu)造函數(shù)不是為了創(chuàng)建對(duì)象而設(shè)計(jì)的,而是用來初始化類,只有非靜態(tài)的構(gòu)造函數(shù)才用來創(chuàng)建對(duì)象(用于創(chuàng)建對(duì)象的構(gòu)造函數(shù)稱為實(shí)例構(gòu)造函數(shù))。由于靜態(tài)構(gòu)造函數(shù)并不對(duì)類的特定實(shí)例進(jìn)行操作,所以也稱為全局或共享構(gòu)造函數(shù)。在C#應(yīng)用程序中,不能直接調(diào)用靜態(tài)構(gòu)造函數(shù)。靜態(tài)構(gòu)造函數(shù)在類的第一個(gè)實(shí)例創(chuàng)建之前或者調(diào)用類的任何靜態(tài)方法之前執(zhí)行,而且最多執(zhí)行一次。因此,靜態(tài)構(gòu)造函數(shù)適合于對(duì)類的靜態(tài)數(shù)據(jù)成員進(jìn)行初始化。5.1.2靜態(tài)構(gòu)造函數(shù)靜態(tài)構(gòu)造函數(shù)可以與實(shí)例構(gòu)造函數(shù)共存,其一般形式如下:static靜態(tài)構(gòu)造函數(shù)名(){//語句;}其中,靜態(tài)構(gòu)造函數(shù)名與類名相同,聲明靜態(tài)構(gòu)造函數(shù)時(shí)不能帶訪問修飾符(如public),并且不能有任何參數(shù)列表和返回值。5.1.2靜態(tài)構(gòu)造函數(shù)我們可以在【實(shí)例5-1】的基礎(chǔ)上增加一個(gè)靜態(tài)構(gòu)造函數(shù),結(jié)果就會(huì)不同5.1.3靜態(tài)類靜態(tài)類使用static關(guān)鍵字來聲明,以指示它僅包含靜態(tài)成員,不能使用new關(guān)鍵字創(chuàng)建靜態(tài)類的實(shí)例。在實(shí)際應(yīng)用中,當(dāng)類中的成員不與特定對(duì)象關(guān)聯(lián)的時(shí)候,就可以把它創(chuàng)建為靜態(tài)類。靜態(tài)類有下以特點(diǎn):(1)靜態(tài)類僅包含靜態(tài)成員;(2)靜態(tài)類不能被實(shí)例化;(3)靜態(tài)類是密封的;(4)靜態(tài)類不能包含實(shí)例構(gòu)造函數(shù)5.1.3靜態(tài)類由于靜態(tài)類是密封的,因此不可被繼承。靜態(tài)類不能包含實(shí)例構(gòu)造函數(shù),但仍可聲明靜態(tài)構(gòu)造函數(shù),以分配初始值或設(shè)置某個(gè)靜態(tài)狀態(tài)。(關(guān)于密封和繼承將在下節(jié)進(jìn)行討論)。靜態(tài)類的優(yōu)點(diǎn)如下:(1)編譯器能夠自動(dòng)執(zhí)行檢查,以確保不添加實(shí)例成員;(2)靜態(tài)類能夠使程序的實(shí)現(xiàn)更簡(jiǎn)單、迅速,因?yàn)椴槐貏?chuàng)建對(duì)象就能調(diào)用其方法。5.2類的繼承性與多態(tài)性5.2.1類的繼承性5.2.2類的多態(tài)性返回5.2.1類的繼承性當(dāng)一個(gè)類從另一個(gè)類派生出來時(shí),派生類就具有了基類中的所有成員,這樣,基類中定義這些成員的代碼,不需要在派生類定義中重寫,在派生類定義中,只需定義派生類自己的成員即可。這樣,既提高了代碼的重用性,從而提高了程序設(shè)計(jì)的效率,又提供了已有程序設(shè)計(jì)的可擴(kuò)展性。類的繼承為面向?qū)ο蟪绦蛟O(shè)計(jì)構(gòu)建一個(gè)分層類結(jié)構(gòu)體系創(chuàng)造了條件,而.NET框架類庫(kù)就是一個(gè)龐大的分層類結(jié)構(gòu)體系。其中Object類是一個(gè)最上層的基類,其他所有類都是直接或間接由Object類繼承而來的。即使用戶自定義的類沒有指定繼承關(guān)系,系統(tǒng)仍然將該類作為Object類的派生類。5.2.1類的繼承性在C#中,類的繼承遵循以下原則:(1)派生類只能從一個(gè)類中繼承,即單繼承。(2)派生類自然繼承基類的成員,但不能繼承基類的構(gòu)造函數(shù)(3)類的繼承可以傳遞,例如:假設(shè)類C繼承于類B,類B又繼承類A,那么C類即具有類B和類A的成員,可以認(rèn)為類A是類C的祖先類。5.2.1類的繼承性1.派生類的聲明在C#中,派生類可以擁有自己的成員,也可以隱式地從它的基類繼承所有成員,包括方法、字段、屬性和事件,但私有成員、構(gòu)造函數(shù)和析構(gòu)函數(shù)等除外。另外,派生類只能從一個(gè)類中繼承,即單繼承。C#中聲明派生類的一般形式如下:[訪問修飾符]class類名[:基類名]{

類的成員;}5.2.1類的繼承性2.構(gòu)造函數(shù)的調(diào)用在C#中,派生類不能繼承其基類的構(gòu)造函數(shù),但是,在創(chuàng)建對(duì)象時(shí),會(huì)調(diào)用構(gòu)造函數(shù),為對(duì)象分配內(nèi)存并初始化對(duì)象的數(shù)據(jù)。創(chuàng)建派生類對(duì)象時(shí),為完成其基類部份的成員初始化,會(huì)調(diào)用基類的構(gòu)造函數(shù)。其調(diào)用構(gòu)造函數(shù)的順序是先調(diào)用基類構(gòu)造函數(shù),再調(diào)用派生類的構(gòu)造函數(shù),以完成數(shù)據(jù)成員分配內(nèi)存空間并進(jìn)行初始化的工作。類的繼承可以傳遞,例如:假設(shè)類C繼承于類B,類B又繼承類A,那么C類即具有類B和類A的成員,可以認(rèn)為類A是類C的祖先類。在這種情況下,構(gòu)造函數(shù)的調(diào)用次序按由高到低順序依次調(diào)用,即先調(diào)用A的構(gòu)造函數(shù),再調(diào)用B的構(gòu)造函數(shù)。最后調(diào)用C的構(gòu)造函數(shù)。5.2.1類的繼承性publicclassA{publicA(){}}publicclassB:A{publicB(){}}5.2.1類的繼承性新類(即派生類)將獲取基類的所有非私有數(shù)據(jù)和行為以及新類為自己定義的所有其他數(shù)據(jù)或行為。因此,新類具有兩個(gè)有效類型:新類的類型和它繼承的類的類型。在上面的示例中,類B既是有效的B,又是有效的A。訪問B對(duì)象時(shí),可以使用強(qiáng)制轉(zhuǎn)換操作將其轉(zhuǎn)換為A對(duì)象。強(qiáng)制轉(zhuǎn)換不會(huì)更改B對(duì)象,但您的B對(duì)象視圖將限制為A的數(shù)據(jù)和行為。將B強(qiáng)制轉(zhuǎn)換為A后,可以將該A重新強(qiáng)制轉(zhuǎn)換為B。并非A的所有實(shí)例都可強(qiáng)制轉(zhuǎn)換為B,只有實(shí)際上是B的實(shí)例的那些實(shí)例才可以強(qiáng)制轉(zhuǎn)換為B。如果將類B作為B類型訪問,則可以同時(shí)獲得類A和類B的數(shù)據(jù)和行為。5.2.1類的繼承性【實(shí)例5-2】繼承中的構(gòu)造函數(shù)調(diào)用演示。5.2.1類的繼承性如果把基類的構(gòu)造函數(shù)publicAnimal()改為如下形式:publicAnimal(stringname,intage){=name;this.age=age;}則編譯時(shí)如出現(xiàn)“Animal不包含采用0個(gè)參數(shù)的構(gòu)造函數(shù)”的錯(cuò)誤,這是因?yàn)楫?dāng)創(chuàng)建派生類對(duì)象時(shí),系統(tǒng)默認(rèn)調(diào)用基類的默認(rèn)構(gòu)造函數(shù)(即無參構(gòu)造函數(shù)),而當(dāng)基類沒有默認(rèn)構(gòu)造函數(shù)或想調(diào)用基類的帶參的構(gòu)造函數(shù)時(shí),需要使用base關(guān)鍵字。其格式如下:public派生類構(gòu)造函數(shù)名(形參列表):base(向基類構(gòu)造函數(shù)傳遞的形參列表){}5.2.1類的繼承性【實(shí)例5-3】調(diào)用基類帶參構(gòu)造函數(shù)演示。5.2.1類的繼承性3.密封類為了阻止一個(gè)類的代碼被其他類繼承,可以使用密封類,因?yàn)樵?NET中,加載密封類時(shí)將對(duì)密封類的方法調(diào)用進(jìn)行優(yōu)化,因此使用密封類可以提高應(yīng)用程序的可靠性和性能。另外,軟件開發(fā)者通過使用密封類還可以把自己的知識(shí)產(chǎn)權(quán)保護(hù)起來,避免他人共享代碼。在C#中,添加關(guān)鍵字sealed可以聲明密封類。5.2.2類的多態(tài)性多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)重要特征,多態(tài)的意思是一種事物有多種形態(tài),即對(duì)象可以表示多個(gè)類型的能力稱為多態(tài)性。如:通過繼承,一個(gè)類可以用作多種類型:可以用作它自己的類型、任何基類型,或者在實(shí)現(xiàn)接口時(shí)用作任何接口類型。這稱為多態(tài)性。多態(tài)性不僅對(duì)派生類很重要,對(duì)基類也很重要。任何情況下,使用基類實(shí)際上都可能是在使用已強(qiáng)制轉(zhuǎn)換為基類類型的派生類對(duì)象?;惖脑O(shè)計(jì)者可以預(yù)測(cè)到其基類中可能會(huì)在派生類中發(fā)生更改的方面。例如,表示汽車的基類可能包含這樣的行為:當(dāng)考慮的汽車為小型貨車或敞篷汽車時(shí),這些行為將會(huì)改變。5.2.2類的多態(tài)性當(dāng)派生類從基類繼承時(shí),它會(huì)獲得基類的所有方法、字段、屬性和事件。為了使用派生類能更改基類的數(shù)據(jù)和行為,C#提供了兩種選擇:一是使用新的派生成員替換基成員,二是重寫虛擬的基成員。5.2.2類的多態(tài)性1.使用new關(guān)鍵字重新定義類的成員使用new關(guān)鍵字來定義與基類中同名的成員,即可替換基類的成員。如果基類定義了一個(gè)方法、字段或?qū)傩?,則new關(guān)鍵字用于在派生類中創(chuàng)建該方法、字段或?qū)傩缘男露x。new關(guān)鍵字應(yīng)放置在要替換的類成員的返回類型之前。使用new

關(guān)鍵字時(shí),調(diào)用的是新的類成員而不是已被替換的基類成員。這些基類成員稱為隱藏成員。如果將派生類的實(shí)例強(qiáng)制轉(zhuǎn)換為基類的實(shí)例,就仍然可以調(diào)用隱藏類成員。5.2.2類的多態(tài)性2.為了使派生類的實(shí)例完全接替來自基類的類成員,基類必須將該成員聲明為虛擬的。通過在該成員的返回類型之前添加virtual關(guān)鍵字來實(shí)現(xiàn)的。然后,派生類可以選擇使用override關(guān)鍵字而不是new,將基類實(shí)現(xiàn)替換為它自己的實(shí)現(xiàn)。用virtual和override關(guān)鍵字定義類成員基類中的聲明格式:publicvirtual方法名稱([參數(shù)列表]){}派生類的聲明格式:publicoverride方法名稱([參數(shù)列表]){}其中,基類與派生類中的方法名稱與參數(shù)列表必須完全一致。5.2.2類的多態(tài)性【實(shí)例5-4】虛方法演示。5.2.2類的多態(tài)性當(dāng)點(diǎn)擊“創(chuàng)建子類對(duì)象并調(diào)用方法”按鈕時(shí),以子類對(duì)象做為實(shí)參,將調(diào)用子類的Eat方法,顯示結(jié)果會(huì)不同無論在派生類和最初聲明虛成員的類之間已聲明了多少個(gè)類,虛成員都將永遠(yuǎn)為虛成員。如果類A聲明了一個(gè)虛擬成員,類B從A派生,類C從類B派生,則類C繼承該虛擬成員,并且可以選擇重寫它,而不管類B是否為該成員聲明了重寫。例如:publicclassA{publicvirtualvoidDoWork(){}}publicclassB:A{publicoverridevoidDoWork(){}}publicclassC:B{publicoverridevoidDoWork(){}}5.2.2類的多態(tài)性派生類可以通過將重寫聲明為密封的來停止虛擬繼承。這需要在類成員聲明中將sealed關(guān)鍵字放在override關(guān)鍵字的前面。publicclassC:B{publicsealedoverridevoidDoWork(){}}在上面的示例中,方法DoWork對(duì)從C派生的任何類都不再是虛方法,但它仍是C的實(shí)例的虛方法--即使將這些實(shí)例強(qiáng)制轉(zhuǎn)換為類型B或類型A也是如此。派生類可以通過使用new關(guān)鍵字替換密封的方法,如下面的示例所示:publicclassD:C{publicnewvoidDoWork(){}}在此情況下,如果在D中使用類型為D的變量調(diào)用DoWork,被調(diào)用的將是新的DoWork。如果使用類型為C、B或A的變量訪問D的實(shí)例,對(duì)DoWork的調(diào)用將遵循虛擬繼承的規(guī)則,即把這些調(diào)用傳送到類C的DoWork實(shí)現(xiàn)。5.2.2類的多態(tài)性使用virtual和override時(shí)要注意以下幾點(diǎn):(1)字段不能是虛擬的,只有方法、屬性、事件和索引器才可以是虛擬的;(2)使用virtual修飾符后,不允許再使用static、abstract或override修飾符;(3)派生類對(duì)象即使被強(qiáng)制轉(zhuǎn)換為基類對(duì)象,所引用的仍然是派生類的成員;(4)派生類可以通過密封來停止虛擬繼承,此時(shí)派生類的成員使用sealedoverride聲明。5.2.2類的多態(tài)性3.調(diào)用基類方法當(dāng)派生類重載或覆蓋基類方法后,如果想調(diào)用基類的同名方法,可以使用base關(guān)鍵字。如,在Dog類的Eat方法中,希望使用基類的Eat方法,可以用如下方法:publicoverridevoidEat(){base.Eat();}5.3抽象類與接口5.3.1抽象類5.3.2接口5.3.3抽象類與接口的比較返回5.3.1抽象類

抽象方法是指在基類的定義中,不包含任何實(shí)現(xiàn)代碼的方法,實(shí)際上就是一個(gè)不具有任何具體功能的方法。這樣的方法唯一的作用就是讓派生類重寫。而只要在類中包含一個(gè)抽象方法,該類即為抽象類。在抽象類中,也可以聲明非抽象方法。1.抽象類與抽象方法的聲明在C#中,抽象類和抽象方法使用關(guān)鍵字abstract聲明,一般形式如下:publicabstractclass抽象類名{[訪問修飾符]abstract返回值類型方法名([參數(shù)列表])}5.3.1抽象類抽象類具有以下特性:抽象類不能實(shí)例化。抽象類可以包含抽象方法和抽象訪問器。不能用sealed修飾符修改抽象類,這意味著抽象類不能被繼承。從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實(shí)實(shí)現(xiàn)。在方法或?qū)傩月暶髦惺褂胊bstract

修飾符以指示方法或?qū)傩圆话瑢?shí)現(xiàn)。抽象方法具有以下特性:抽象方法是隱式的虛方法。只允許在抽象類中使用抽象方法聲明。因?yàn)槌橄蠓椒暶鞑惶峁?shí)際的實(shí)現(xiàn),所以沒有方法體;方法聲明只是以一個(gè)分號(hào)結(jié)束,并且在簽名后沒有大括號(hào)({})。5.3.1抽象類實(shí)現(xiàn)由一個(gè)重寫方法override提供,此重寫方法是非抽象類的一個(gè)成員。在抽象方法聲明中使用static或virtual修飾符是錯(cuò)誤的。除了在聲明和調(diào)用語法上不同外,抽象屬性的行為與抽象方法一樣。在靜態(tài)屬性上使用abstract

修飾符是錯(cuò)誤的。在派生類中,通過包括使用override修飾符的屬性聲明,可以重寫抽象的繼承屬性。5.3.1抽象類抽象類中也可以有抽象屬性。類的屬性成員添加了abstract關(guān)鍵字后,就成了抽象屬性。抽象屬性不提供屬性訪問器的實(shí)現(xiàn),它只聲明該類支持的屬性,而將訪問器的實(shí)現(xiàn)留給派生類。抽象屬性同樣可以是只讀的、只寫的或可讀寫的屬性。一般形式如下:publicabstract返回值類型屬性名{get;set;}抽象類可以包含抽象的成員,如抽象屬性和抽象方法,也可以包含非抽象的成員,甚至還可以包含虛方法。要注意的是,抽象成員必須在抽象類中聲明,但抽象類不要求必須包含抽象成員5.3.1抽象類2.重載抽象方法抽象類中的抽象方法和抽象屬性都沒有提供實(shí)現(xiàn),當(dāng)定義抽象類的派生類時(shí),派生類必須重載基類的抽象方法和抽象屬性(如果派生類沒有進(jìn)行重載,則派生也必須聲明為抽象類,即在類定義前加上abstract。這一點(diǎn)是與虛方法不同的,因?yàn)閷?duì)于基類的虛方法,其派生類可以不重載。重載抽象類的方法和屬性必須使用override關(guān)鍵字。重載抽象方法的格式為:publicoverride方法名稱([參數(shù)列表]){}其中,方法名稱和參數(shù)列表必須與抽象類中的抽象方法完全一致。當(dāng)抽象類從基類繼承虛方法時(shí),抽象類可以使用抽象方法重寫該虛方法。例如://compilewith:/target:librarypublicclassD{publicvirtualvoidDoWork(inti){//Originalimplementation.}}publicabstractclassE:D{publicabstractoverridevoidDoWork(inti);}publicclassF:E{publicoverridevoidDoWork(inti){//Newimplementation.}}如果將虛方法聲明為抽象方法,則它對(duì)于從抽象類繼承的所有類而言仍然是虛的。繼承抽象方法的類無法訪問該方法的原始實(shí)現(xiàn)。在前面的示例中,類F上的DoWork無法調(diào)用類D上的DoWork。在此情況下,抽象類可以強(qiáng)制派生類為虛方法提供新的方法實(shí)現(xiàn)。5.3.1抽象類【實(shí)例5-5】抽象方法和抽象類演示。5.3.2接口接口(interface)是C#的一種數(shù)據(jù)類型,屬于引用類型。一個(gè)接口定義一個(gè)協(xié)定。接口可以包含方法、屬性、事件和索引器,接口本身不提供它所定義的成員的實(shí)現(xiàn),接口只指定實(shí)現(xiàn)該接口的類或結(jié)構(gòu)必須提供的成員。實(shí)現(xiàn)某接口的類必須遵守該接口定義的協(xié)定,即必須提供接口成員的實(shí)現(xiàn)。1.接口的聲明在C#中,聲明接口使用interface關(guān)鍵字,一般形式如下:[訪問修飾符]interface接口名[:基接口列表]{//接口成員}5.3.2接口接口成員可以是屬性、方法、索引器和事件,不能包含字段、構(gòu)造函數(shù)等。所有接口成員隱式地具有了public訪問修飾符,因此,接口成員不能添加任何訪問修飾符。下面示例定義了一個(gè)USB的接口,該接口包含了一個(gè)TransData方法簽名和一個(gè)獲到最大傳輸速率的只讀屬性。。interfaceIUsb{intMaxSpeed{get;}stringTransData(stringfrom,stringto);}5.3.2接口2.接口的實(shí)現(xiàn)接口主要用來定義一個(gè)規(guī)則,讓企業(yè)內(nèi)部或行業(yè)內(nèi)部的軟件開發(fā)人員按標(biāo)準(zhǔn)去實(shí)現(xiàn)應(yīng)用程序的功能。因此,繼承接口的類或結(jié)構(gòu)必須實(shí)現(xiàn)接口中的所有屬性、方法、索引器和事件,繼承接口的方法與繼承類相似3.接口的繼承接口也可以繼承其它接口,而接口可以多繼承,即接口可以從多個(gè)接口繼承,基接口名之間用逗號(hào)分隔。

5.3.2接口4.多重接口實(shí)現(xiàn)C#不允許多重類繼承,但是C#允許多重接口實(shí)現(xiàn),這意味著一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,如果一個(gè)Mobile類支持USB,也可以支持Bluetooth,我們就應(yīng)該同時(shí)實(shí)現(xiàn)IUsb和IBluetooth接口,在繼承時(shí),兩個(gè)接口之間用逗號(hào)分隔。其類的頭部如下所示:publicclassMobile:IUsb,IBluetooth如果類Mobile是類phone的派生子類,也可以同時(shí)繼承phone類。但要注意,基類必須在所有的接口之前,如:publicclassMobile:Phone,IUsb,IBluetooth5.3.2接口5.訪問接口的方法當(dāng)類Mp3實(shí)現(xiàn)了IUsb后,我們可以通過MP3類的對(duì)象訪問IUsb的成員,就好象是Mp3類的成員一樣:Mp3m=newMp3();lblShow.Text=m.TransData("計(jì)算機(jī)","MP3設(shè)備");或者我們也可以將Mp3對(duì)象轉(zhuǎn)換成接口類型,然后用這個(gè)接口來訪問方法:Mp3m=newMp3();IUsbiu=(IUsb)m;lblShow.Text=iu.TransData("計(jì)算機(jī)","MP3設(shè)備");5.3.2接口【實(shí)例5-6】接口演示。5.3.3抽象類與接口的比較抽象類是一種不能實(shí)例化的類,抽象類可以包含抽象成員,也可以包含非抽象成員,即抽象類可以是完全實(shí)現(xiàn)的,也可以是部分實(shí)現(xiàn)的,或者完全不實(shí)現(xiàn)的。抽象類可以用來封裝所有派生類的通用功能。與抽象類不同的是,接口頂多像一個(gè)完全沒有實(shí)現(xiàn)的只包含抽象成員的抽象類,因此無法使用接口來封裝所有派生類的通用功能,接口更多地用來制定程序設(shè)計(jì)開發(fā)規(guī)范,接口的代碼實(shí)現(xiàn)由開發(fā)者完成。例如,有關(guān)XML文檔的處理,萬維網(wǎng)聯(lián)盟(W3C)就制定了一個(gè)DOM(文檔對(duì)象模型)規(guī)范,而具體的代碼實(shí)現(xiàn)由諸如Microsoft、Sun等公司去實(shí)現(xiàn)。5.3.3抽象類與接口的比較C#規(guī)定一個(gè)類只能從一個(gè)基類派生,但允許從多個(gè)接口派生。例如,如果把實(shí)例5-6中的兩個(gè)接口改為抽象類,則不允許同時(shí)使用它們來派生Mobile類。抽象類為管理組件版本提供了一個(gè)簡(jiǎn)單易行的方法。通過更新基類,所有派生類都將自動(dòng)進(jìn)行相應(yīng)改動(dòng)。而接口在創(chuàng)建后就不能再更改,如果需要修改接口,必須創(chuàng)建新的接口。5.4嵌套類、分部類與命名空間5.4.1嵌套類5.4.2分部類5.4.3命名空間返回5.4.1嵌套類在類的內(nèi)部或結(jié)構(gòu)的內(nèi)部定義的類型稱為嵌套類型,又稱內(nèi)部類型。不論是類還是結(jié)構(gòu),嵌套類型均默認(rèn)為private,嵌套類型也可以設(shè)置為public、internal、protected或protectedinternal。嵌套類型通常需要實(shí)例化為對(duì)象之后,才能引用其成員,其使用方法與類的普通成員使用基本相同?!緦?shí)例5-7】使用嵌套類計(jì)算長(zhǎng)方形面積。5.4.2分部類分部類允許將類、結(jié)構(gòu)或接口的定義拆分到兩個(gè)或多個(gè)源文件中,讓每個(gè)源文件只包含類型定義的一部分,編譯時(shí)編譯器自動(dòng)把所有部分組合起來進(jìn)行編譯。有了分部類,一個(gè)類的源代碼可以分布于多個(gè)獨(dú)立文件中,在處理大型項(xiàng)目時(shí),過去很多只能由一個(gè)人進(jìn)行的編程任務(wù),現(xiàn)在可以由多個(gè)人同時(shí)進(jìn)行,這樣將大大加快了程序設(shè)計(jì)的工作進(jìn)度。有了分部類,使用自動(dòng)生成的源代碼時(shí),無需重新創(chuàng)建源文件便可將代碼添加到類中。事實(shí)上,當(dāng)創(chuàng)建Windows應(yīng)用程序或Web應(yīng)用程序時(shí),就是在VisualStudio2010自動(dòng)生成源代碼的基礎(chǔ)之上專注于項(xiàng)目的業(yè)務(wù)處理,編譯時(shí)VisualStudio2010會(huì)自動(dòng)把編寫的代碼與自動(dòng)生成的代碼進(jìn)行合并編譯。5.4.2分部類處理分部類的定義時(shí)需遵循以下幾個(gè)規(guī)則:(1)同一類型的各個(gè)部分的所有分部類的定義都必須使用partial進(jìn)行修飾。(2)如果將任意部分聲明為抽象的,則整個(gè)類型都被視為抽象的。如果將任意部分聲明為密封的,則整個(gè)類型都被視為密封的。(3)partial修飾符只能出現(xiàn)在緊靠關(guān)鍵字class、struct或interface前面的位置。(4)分部類的各部分或者各個(gè)源

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論