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