資源描述:
《面向?qū)ο缶幊蹋豪^承》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、C#高級(jí)編程:繼承KavassZhu2011/03/24課程重點(diǎn)實(shí)現(xiàn)繼承和接口繼承多重繼承調(diào)用函數(shù)的基類(lèi)版本虛方法、隱藏方法和方法的重寫(xiě)派生類(lèi)的構(gòu)造函數(shù)抽象類(lèi)和抽象函數(shù)接口的定義和實(shí)現(xiàn)1.繼承的類(lèi)型繼承的類(lèi)型主要包括兩種:實(shí)現(xiàn)繼承和接口繼承。實(shí)現(xiàn)繼承:表示一個(gè)類(lèi)型派生于一個(gè)基類(lèi)型,擁有該基類(lèi)型的所有成員字段和函數(shù),在實(shí)現(xiàn)繼承中,派生類(lèi)型的每個(gè)函數(shù)采用基類(lèi)型的實(shí)現(xiàn)代碼,除非在派生類(lèi)型的定義中指定重寫(xiě)該函數(shù)的實(shí)現(xiàn)代碼。在需要給現(xiàn)有類(lèi)型添加功能,或許多相關(guān)的類(lèi)型共享一個(gè)重要的公共功能時(shí),這種類(lèi)型的繼承是非常有效的。接口繼承:表示一個(gè)類(lèi)型只繼承類(lèi)函數(shù)的簽名,沒(méi)有繼承任
2、何實(shí)現(xiàn)代碼。在需要指定該類(lèi)型具有某些可用的特性時(shí),最好使用這種類(lèi)型的繼承。接口繼承常常被看做提供了一種契約:讓類(lèi)型派生于接口,來(lái)保證為客戶(hù)提供某個(gè)功能。在C#中,既有實(shí)現(xiàn)繼承,也有接口繼承。他們沒(méi)有強(qiáng)弱之分,因?yàn)檫@兩種繼承都完全內(nèi)置于語(yǔ)言中,因此很容易為不同的情形選擇最好的體系結(jié)構(gòu)。C#不支持多重實(shí)現(xiàn)繼承,但支持多重接口繼承。結(jié)構(gòu)不支持實(shí)現(xiàn)繼承,但結(jié)構(gòu)自動(dòng)派生于System.ValueType,并且支持接口繼承。結(jié)構(gòu)總是派生于System.ValueType,還可以派生于任意多個(gè)接口類(lèi)總是派生于用戶(hù)選擇的另一個(gè)類(lèi),還可以派生于任意多個(gè)接口如果要聲明一個(gè)類(lèi)派生于
3、另一個(gè)類(lèi),可以使用下面的語(yǔ)法:classMyClass:MyBaseClass{}如果類(lèi)或結(jié)構(gòu)也派生于接口,則用逗號(hào)分隔開(kāi)基類(lèi)和接口:classMyClass:MyBaseClass,IInterface1,IInterface2{}對(duì)于結(jié)構(gòu)語(yǔ)法如下:structMyStruct:IInterface1,IInterface2{}如果在類(lèi)定義中沒(méi)有指定基類(lèi),C#編譯器就假定System.Object是基類(lèi)。因此下面兩段代碼是相同的:classMyClass:Object{}classMyClass{}C#至此object關(guān)鍵字,它用作System.Object
4、類(lèi)的假名,所以也可以寫(xiě)成:clsssMyClass:object{}2.實(shí)現(xiàn)繼承把一個(gè)基類(lèi)函數(shù)聲明為virtual,該函數(shù)就可以在任何派生類(lèi)中重寫(xiě)。ClassMyBaseClass{PublicvirtualstringVirtualMethod(){return“thisisvirtualmethod”;}}也可以把屬性聲明為virtual。對(duì)于虛屬性或重寫(xiě)屬性,語(yǔ)法與非虛屬性是相同的,但是要在定義中加上關(guān)鍵字virtual,其語(yǔ)法如下所示:publicvirtualstringName{Get{return_name;}Set{_name=value;}}
5、2.1虛方法C#中虛函數(shù)的概念與標(biāo)準(zhǔn)OOP概念相同,可以在派生類(lèi)中重寫(xiě)虛函數(shù)。在調(diào)用方法時(shí),會(huì)調(diào)用對(duì)象類(lèi)型合適的方法。C#中,函數(shù)默認(rèn)不是徐牛的,但可以顯示的聲明為virtual。在派生類(lèi)中需要重寫(xiě)虛函數(shù)要使用override關(guān)鍵字顯式聲明:classMyClass:BaseClass{PublicoverridestringVirtualMethod(){return“thisisoverridemethod”;}}如果在派生類(lèi)中沒(méi)有使用override關(guān)鍵字,并且派生類(lèi)的函數(shù)名稱(chēng)和簽名與基類(lèi)中的函數(shù)和簽名一致時(shí),將會(huì)產(chǎn)生編譯警告。成員字段和靜態(tài)函數(shù)不能聲明
6、為virtual。因?yàn)樗粚?duì)類(lèi)中的實(shí)例函數(shù)成員有意義。虛方法的聲明和重寫(xiě)不能是private。如果簽名相同的方法在基類(lèi)和派生類(lèi)中都進(jìn)行了聲明,但該方法沒(méi)有聲明為virtual和override,派生類(lèi)方法就會(huì)隱藏基類(lèi)方法。在C#中隱藏方法有顯式隱藏和隱式隱藏兩種,一般建議用顯式隱藏。隱式隱藏會(huì)收到編譯器的警告信息。classBaseClass{PublicvoidTest(){}}顯式隱藏classMyClass:BaseClass{PublicnewvoidTest(){}}隱式隱藏classMyClass:baseClass{publicvoidTest(
7、){}}2.2隱藏方法C#有一種特殊的語(yǔ)法用于從派生類(lèi)中調(diào)用方法的基類(lèi)版本:base.MethodName()。語(yǔ)法如下:classBaseClass{PublicvirtualstringgetName(){return“kavass”;}}ClassMyClass:BaseClass{publicoverridestringgetName(){returnbase.getName()+”zhu”;}}這時(shí)MyClass的實(shí)例調(diào)用getName()方法是將得到的是基類(lèi)的getName的方法加“zhu”以后的字符串2.3調(diào)用函數(shù)的基類(lèi)版本C#允許把類(lèi)和函數(shù)聲明
8、為abstract,抽象類(lèi)不能實(shí)例化,