資源描述:
《c#繼承、多態(tài)、封裝、接口等的理解》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、接口:???是隱式公共方法和屬性組合起來,以封裝特定功能的一個集合。接口不能單獨(dú)存在,不能像實(shí)例化一個類那樣實(shí)例化接口,但可以建立接口類型的變量。接口不能外含執(zhí)行其成員的任何代碼,而只能定義成員本身,執(zhí)行過程必須在執(zhí)行接口的類中實(shí)現(xiàn)。abstract和sealed不能在接口中使用,因?yàn)檫@兩個修飾符在接口中定義是沒有意義的(它們不包含執(zhí)行代碼,所以不能直接實(shí)例化,且必須是可以繼承的)。接口成員都是公共的。接口沒有指定屬性應(yīng)如何存儲,所以不能有域。最后,接口與類一樣,可以定義為類的成員(但與接口的其他成員不同,因?yàn)榻涌诓荒馨愋投x)???
2、執(zhí)行接口的類必須包含該接口所有成員的執(zhí)行代碼,且必須匹配指定的簽名(包括匹配指定的get和set塊)??梢允褂胿irtual或abstract來執(zhí)行接口成員,但不能用static或const。接口中添加屬性???stringName???{???????get;???????set;???}--------------------------------------抽象類:???抽象類可以有抽象成員(沒有代碼體,且必須在派生類中執(zhí)行,否則派生類本身必須也是抽象的)和非抽象成員(有代碼體,也可以是虛擬的,這樣可以在派生類中重寫)。抽象的方法
3、可以理解為沒有方法體的虛函數(shù)。--------------------------------------接口和抽象的區(qū)別:???接口成員被定義為公共的,因?yàn)樗鼈儍A向于外部使用,但抽象類的成員也可以是私有的(只要它們不是抽象的)、受保護(hù)的、內(nèi)部的或受保護(hù)的內(nèi)部成員(其中受保護(hù)的內(nèi)部成員只能在應(yīng)用程序的代碼或派生類中訪問)。此外,接口不能包含字段、構(gòu)造函數(shù)、析構(gòu)函數(shù)、靜態(tài)成員或常量。???抽象類主要用作對象系列的基類,共享某些主要特性。接口則主要由類來使用,其中這些類在基礎(chǔ)水平上有所不同,但仍可以完成某些相同的任務(wù)。???抽象類用于特性,接
4、口用于功能。--------------------------------------繼承:???被繼承(也稱為派生)的類稱為父類(也稱為基類)。C#中的對象僅能派生于一個基類。只有派生類才能訪問一個protected成員。派生類可以提供成員的其它執(zhí)行代碼。這種執(zhí)行代碼不會刪除原來的代碼,仍可以在類中訪問原來的代碼,但外部代碼不能訪問它們。如果沒有提供其它執(zhí)行方式,外部代碼就訪問基類中成員的執(zhí)行代碼。???注意:虛擬成員不能是私有成員?;愡€可以定義為抽象類,抽象類不能直接實(shí)例化,要使用抽象類,必須繼承這個類。類可以是密封(sealed
5、)的,密封的類不能用作基類,所以也沒有派生類。接口也可以派生于其它接口,與類不同的是,接口可以派生多個基接口(以類可以支持多個接口的方式派生)。編譯器不允許派生類的可訪問性比基類更高,也就是說,內(nèi)部類可以繼承一個公共類,但公共類不能繼承一個內(nèi)部類--------------------------------------多態(tài)性:???可以把某個基本類型的變量賦予其派生類型的變量。例AnimalmyAnimal=myCow;//基本類型=派生類型變量然后就可以通過這個變量調(diào)用基類的方法,myAnimal.EatFood(),結(jié)果是調(diào)用派生類
6、中的EatFood()執(zhí)行代碼。注意,不能以相同的方式調(diào)用派生類上定義的方法,因?yàn)樗腔愋妥兞?。但是,可以基本類型的變量轉(zhuǎn)換為派生類變量,調(diào)用派生類的方法。CowmyNewCow=(Cow)myAnimal;//把基本類型變量轉(zhuǎn)換為派生類變量myNewCow.Moo();//調(diào)用派生類方法接口=派生類,則調(diào)用派生類方法,但不可調(diào)用未在接口中定義的方法,除非轉(zhuǎn)換派生類對象=(派生類)接口抽象類因?yàn)橛行?shí)體代碼,所在在派生類中要么未定義,要么虛(virtual,虛的話,派生類中必須override,這種情況稱為重寫,重寫則將替換基類和派生類
7、的代碼,但在派生類的代碼中仍可以用base引用基類),要么定義過(定義過的話,派生類如果要new,則必須加new關(guān)鍵字,這種情況稱為隱藏,隱藏的話仍可以通過基類來訪問)重寫類與隱藏類:隱藏仍可以通過基類來訪問,使用new來定義它們。隱藏是覆蓋,但仍可以通過將其轉(zhuǎn)換成基類型,引用基類型的方法。new重寫是實(shí)現(xiàn)了隱藏。重寫則將替換基類和派生類的代碼,重寫是刪除,除了在派生類的代碼中可以用base引用基類,別的地方都不能。virtual/override是重寫。C#中,函數(shù)默認(rèn)情況不是虛擬的,但可以明確聲明是虛擬的(構(gòu)造函數(shù)除外)。如果基類函數(shù)
8、沒有聲明為virtual,繼承類中要使用與基類簽名相同的方法,必須用new關(guān)鍵字聲明,否則編譯時會有警告(最終效果沒區(qū)別),都是將基類方法隱藏。如果基類函數(shù)聲明為virtual,繼承類要使用與