占梅
(廈門南洋職業(yè)學(xué)院 福建省廈門市 361102)
面向?qū)ο缶哂蟹庋b、繼承、多態(tài)三大特征,這些特性主要通過(guò)類來(lái)體現(xiàn)。封裝可以隱藏實(shí)現(xiàn)細(xì)節(jié),其能夠在所對(duì)應(yīng)對(duì)象中對(duì)具體事物屬性及行為進(jìn)行包裝,但該對(duì)象僅能夠?qū)⒉糠謱傩约靶袨閷?duì)外進(jìn)行有選擇性的公布,導(dǎo)致代碼模塊化。繼承是一個(gè)面向?qū)ο蟮脑~語(yǔ)。說(shuō)明一個(gè)類(派生類)能分享其它類(基類)的特征和行為,其子對(duì)象能夠繼承父對(duì)象所擁有的屬性及行為,繼承也能夠擴(kuò)展自身已存在的代碼模塊(類)。多態(tài)就是相同的事物,調(diào)用其相同的方法,參數(shù)也相同時(shí),但表現(xiàn)的行為卻不同。其中封裝及繼承的目的均是為了能夠使代碼可以重復(fù)使用。
對(duì)抽象獲得數(shù)據(jù)及功能等進(jìn)行結(jié)合形成有機(jī)整體的過(guò)程即為封裝,其實(shí)質(zhì)上是數(shù)據(jù)與操作數(shù)據(jù)源代碼兩者的結(jié)合,也是一個(gè)面向?qū)ο蟮母拍?,?duì)外部世界隱藏類的內(nèi)部,類的成員包括數(shù)據(jù)與函數(shù)。數(shù)據(jù)的安全性及編程簡(jiǎn)化處理都有賴于封裝實(shí)現(xiàn),因此在對(duì)封裝進(jìn)行實(shí)踐應(yīng)用時(shí)無(wú)需詳細(xì)了解其步驟,只需要通過(guò)外部接口對(duì)類成員賦予特有的訪問(wèn)權(quán)限便能夠使用。封裝在面向?qū)ο蟪潭戎兄饕康氖欠乐箤?duì)實(shí)現(xiàn)細(xì)節(jié)的訪問(wèn)。封裝不僅可以封裝成員變量,還可以封裝成員方法。
(1)封裝的具體實(shí)現(xiàn)需要遵循一定的原則,隱藏?zé)o需對(duì)外提供的內(nèi)容,包括屬性等,并詳細(xì)說(shuō)明公共方法便于對(duì)其訪問(wèn)。
(2)作為一種權(quán)限修復(fù)符,private 關(guān)鍵字能夠?qū)Τ蓡T變量及成員方法進(jìn)行相應(yīng)的修飾,但需要注意的是被修飾成員的訪問(wèn)僅能夠在本類中進(jìn)行訪問(wèn)。用private 修飾成員變量,提供對(duì)應(yīng)的get()和set ()方法,private 僅僅是封裝的一種體現(xiàn)形式。
繼承可以減少代碼的冗余,提高軟件模塊的可復(fù)用性和可擴(kuò)充性,提高軟件的開(kāi)發(fā)效率。繼承是面向?qū)ο缶幊痰慕M成部分,是所有面向?qū)ο蟮恼Z(yǔ)言都要具備的特性。先將幾個(gè)類中相同的屬性和方法進(jìn)行抽離,單獨(dú)定義在一個(gè)新建的類中。其他的類直接繼承當(dāng)前新建的類,語(yǔ)法是派生類:基類(或者是子類:父類),派生類可以直接使用基類中允許使用的屬性和方法,可以使用base 關(guān)鍵字直接訪問(wèn)基類的屬性和方法(成員變量)。在C#中派生類中,能夠由基類完成對(duì)方法、屬性、事件以及索引指示器等的繼承,但無(wú)法對(duì)構(gòu)造函數(shù)、折構(gòu)函數(shù)進(jìn)行繼承。派生類對(duì)基類成員的繼承主要是采用隱式的方法繼承的。
2.2.1 可傳遞性
繼承在實(shí)施過(guò)程中具有一定的可傳遞性,如B 派生了C,而A又能夠派生B,由此可以發(fā)現(xiàn)C 不僅屬于B 中聲明成員,其同時(shí)也是A 成員,所有類基類均為Object 類。
2.2.2 可擴(kuò)展性
繼承時(shí)可以使用現(xiàn)有類的所有功能,在無(wú)需重新編寫原來(lái)類的情況下即可對(duì)這些功能進(jìn)行擴(kuò)展。其具有添加新成員的功能,但無(wú)法將繼承成員去除。
2.2.3 訪問(wèn)方式可設(shè)定性
不能被繼承的函數(shù)還包括構(gòu)造函數(shù)、析構(gòu)函數(shù),另外的成員盡管訪問(wèn)方式不同都能夠得到繼承,通常,基類成員采取不同的訪問(wèn)方式主要是目的是明確是否可以通過(guò)派生類進(jìn)行訪問(wèn)。
2.2.4 可覆蓋性
派生類若將新成員定義為與基類成員同名時(shí),能夠?qū)σ牙^承成員名進(jìn)行覆蓋,但是覆蓋并不是刪除,而是限制了對(duì)同名成員的訪問(wèn)。
2.2.5 可重載性
通常,虛方法、虛屬性包括虛索引指示器的定義都可以通過(guò)類實(shí)現(xiàn),基于其派生類功能,能夠?qū)崿F(xiàn)對(duì)上述成員的重載,呈現(xiàn)出多態(tài)性特征。
2.2.6 可多級(jí)繼承性
一般情況下,派生類的繼承僅能夠通過(guò)一個(gè)類完成,其多重繼承則需要利用接口技術(shù)。
2.3.1 使用base 訪問(wèn)基類成員
對(duì)基類成員的訪問(wèn)主要利用的是base 關(guān)鍵字,若基類中存在被其他虛擬方法重寫的方法,那么可以對(duì)基類進(jìn)行調(diào)用,構(gòu)造相應(yīng)的函數(shù)。需要注意的是基本訪問(wèn)實(shí)現(xiàn)途徑主要包括構(gòu)造函數(shù)、實(shí)例方法以及實(shí)例屬性訪問(wèn)器,無(wú)法實(shí)現(xiàn)靜態(tài)方法應(yīng)用 base 關(guān)鍵字訪問(wèn)。若真的需要靜態(tài)方法則此時(shí)需要顯式類型轉(zhuǎn)換對(duì)基類成員進(jìn)行訪問(wèn)。
2.3.2 隱藏基類成員
若想隱藏基類成員可采用密封類實(shí)現(xiàn),其主要目的為避免編寫的類被繼承,或現(xiàn)有的類沒(méi)有繼承的必要。基于這一需求,密封類(sealed class)概念誕生。密封類是不能被繼承的類,為了避免從一個(gè)類中繼承,密封類不能是抽象類,因?yàn)槌橄箢惪偸窍M焕^承的。
密封類的應(yīng)用能夠避免繼承類,密封方法的提出防止了派生類重載該方法。通??梢圆捎胹ealed 修飾符對(duì)方法類進(jìn)行修飾,密封方法覆蓋范圍較廣,通常每個(gè)成員方法都可以稱之為密封法,且sealed 與override 修飾符能夠同時(shí)應(yīng)用。
由基類繼承的隱藏成員可以通過(guò) new 修飾符得以顯式。當(dāng)需要對(duì)繼承成員進(jìn)行隱藏時(shí),只需在派生類中對(duì)相同名稱進(jìn)行聲明,并予以 new 修飾符修飾。
在面向?qū)ο蟮南到y(tǒng)中,多態(tài)性是一個(gè)非常重要的概念,使用不同的實(shí)例去執(zhí)行不同的操作,好處就是增強(qiáng)程序的可擴(kuò)展性及可維護(hù)性,使代碼更簡(jiǎn)潔。多態(tài)性通過(guò)派生類重載基類中的虛函數(shù)型方法來(lái)實(shí)現(xiàn)。在C#中多態(tài)性的定義是:在繼承關(guān)系的前提下,實(shí)例化出不同的對(duì)象,這些對(duì)象調(diào)用相同的方法,但是表現(xiàn)出不同的行為,這就叫做多態(tài)。而表現(xiàn)不同的行為就是在各個(gè)子類中用overide進(jìn)行重寫。在C#語(yǔ)言中,體現(xiàn)多態(tài)有三種方式,虛方法、抽象類、接口。在調(diào)用時(shí)以方法參數(shù)區(qū)分具體調(diào)用哪個(gè)方法。運(yùn)行時(shí)的多態(tài)性就是虛擬成員在基類中申明了方法、屬性、索引器或事件,也就是做一個(gè)簡(jiǎn)單的處理。使用Virtual 關(guān)鍵字將成員申明為虛擬成員。而在聲明時(shí),父類的方法前面加上Virtual 關(guān)鍵字,子類的方法前面加上override 關(guān)鍵字,且與父類方法同名,表示父類的方法可以被子類進(jìn)行修改和重新定義。C#中,運(yùn)行時(shí)的多態(tài)性通過(guò)虛成員實(shí)現(xiàn)。運(yùn)行時(shí)的多態(tài)性具有高度靈活和抽象的特點(diǎn),且必須是虛擬方法,方法的簽名必須一致,包括方法名稱,參數(shù)和參數(shù)類型。
多態(tài)存在的三個(gè)必要條件:繼承、重寫(子類繼承父類后對(duì)父類方法進(jìn)行重新定義)、父類引用指向子類對(duì)象。
3.2.1 通過(guò)接口實(shí)現(xiàn)多態(tài)
通常,多個(gè)類可以通過(guò)同一“接口”得以實(shí)現(xiàn),單個(gè)類也能夠保障一個(gè)或多個(gè)接口的實(shí)現(xiàn)。實(shí)現(xiàn)類主要是用于部分成員特定實(shí)現(xiàn),包括接口描述類方法、屬性和事件等,另外,成員接收、返回參數(shù)類型也往往通過(guò)實(shí)現(xiàn)類完成。
組件編程擁有強(qiáng)大的技能,主要表現(xiàn)為可在同一對(duì)象上完成多接口,且每個(gè)接口之間的屬性及事件組成情況等聯(lián)系密切。接口實(shí)現(xiàn)后,其他組件可對(duì)接口提供相應(yīng)的各項(xiàng)功能,無(wú)需對(duì)其特定功能做出相應(yīng)的考慮,后續(xù)組件功能豐富,且不會(huì)影響到核心功能。如有需求,可以由專業(yè)技術(shù)開(kāi)發(fā)人員分解組件功能,作為一種單獨(dú)接口進(jìn)行實(shí)現(xiàn)。
接口的書寫格式要求如下:
(1)在接口中,我們使用Interface 關(guān)鍵字來(lái)聲明一個(gè)接口,沒(méi)有class 名稱為"IXxxx";
(2)接口中不能包含字段,但是可以包含屬性;
(3)接口中的抽象方法不能有方法體,全是抽象方法,但是又不允許使用abstract 進(jìn)行修飾;
(4)接口中的成員不允許添加訪問(wèn)修飾符,默認(rèn)都是public;
(5)最終形成了上面的樣式,顯得非常的簡(jiǎn)潔。
接口注意事項(xiàng):
(1)一個(gè)類可實(shí)現(xiàn)多個(gè)接口,被實(shí)現(xiàn)的多個(gè)接口用逗號(hào)分開(kāi);
(2)一個(gè)接口可繼承多個(gè)接口,多個(gè)接口間也要用逗號(hào)分開(kāi);
(3)由于接口中的方法均為抽象方法,所以接口肯定是不能實(shí)例化的。
3.2.2 通過(guò)繼承實(shí)現(xiàn)多態(tài)
多個(gè)類的繼承能夠通過(guò)一個(gè)基類完成,完成繼承后,不僅能夠?qū)崿F(xiàn)對(duì)基類方法、屬性及事件的接收,而且能夠結(jié)合實(shí)際需要附加新的成員,對(duì)基類成員進(jìn)行重寫,并提供豐富的實(shí)現(xiàn)途徑與方法。
C#具有多態(tài)性的特點(diǎn),該機(jī)制應(yīng)用于小規(guī)模開(kāi)發(fā)任務(wù)表現(xiàn)為強(qiáng)大的功能,但在大規(guī)模系統(tǒng)應(yīng)用中尚存在一定的不足,主要表現(xiàn)為對(duì)繼承驅(qū)動(dòng)多態(tài)性過(guò)分強(qiáng)調(diào),使得大規(guī)模資源由編碼轉(zhuǎn)變?yōu)樵O(shè)計(jì),對(duì)總開(kāi)發(fā)時(shí)間縮短無(wú)明顯的作用。使用繼承最為突出的功能即在現(xiàn)有類中進(jìn)行功能的添加,若基類框架得到充分調(diào)試后開(kāi)始,能夠提升程序員工作效率。若應(yīng)用程序需要對(duì)多個(gè)相關(guān)類進(jìn)行設(shè)計(jì),要實(shí)現(xiàn)相關(guān)類的共享,那么要應(yīng)用繼承。通常重疊功能的實(shí)現(xiàn)多依托基類,而基類又能夠派生應(yīng)用程序中使用的類。
3.2.3 通過(guò)抽象類實(shí)現(xiàn)多態(tài)
作為一種特殊基類,抽象類不僅包含了普通類成員,而且還容納了大量抽象類成員。所謂抽象類成員,其主要指的是無(wú)法被實(shí)例化的屬性、方法。由抽象類派生的類需要具備抽象屬性與方法。抽象類不僅具備繼承的功能,而且能夠提供接口元素。但需要注意的是抽象類無(wú)法實(shí)例化,應(yīng)通過(guò)繼承發(fā)揮作用。類的成員需要通過(guò)繼承類得以實(shí)現(xiàn)。類成員實(shí)現(xiàn)后仍有被重寫的可能性,且能夠完成附加接口或其他功能。
抽象類的繼承、接口功能的實(shí)現(xiàn),兼具已實(shí)現(xiàn)方法與未實(shí)現(xiàn)方法的功能與屬性,后者往往需要在繼承類中得以實(shí)現(xiàn)。因此需要在類方法中添加不變功能,打開(kāi)針對(duì)其他過(guò)程的靈活性。抽象類的一大優(yōu)勢(shì)如下:在對(duì)新版本進(jìn)行組件時(shí),可結(jié)合需求在基類中添加附加方法,但要維持接口不變。抽象類的使用往往為相關(guān)組件在保障一組相同功能且在其他方法中保持靈活性時(shí),應(yīng)用價(jià)值高。
抽象類:抽象類使用抽象方法來(lái)實(shí)現(xiàn),在C#中,我們規(guī)定是無(wú)法創(chuàng)建抽象類的實(shí)例,嚴(yán)格的說(shuō):就算定義的抽象方法中沒(méi)有寫抽象方法,也是無(wú)法創(chuàng)建抽象類的實(shí)例的;如果能實(shí)例出來(lái)一個(gè)抽象,那么調(diào)用這些無(wú)方法體的抽象方法是也沒(méi)有任何意義的,因此抽象類是無(wú)法實(shí)例化的;還有就是抽象類中不光可以寫抽象方法,還可以寫普通方法,也可以寫虛方法,這也是和接口的區(qū)別。
封裝具有鮮明的優(yōu)勢(shì),封裝良好一方面能夠減少耦合,另一方面能夠便于自由修改類內(nèi)部結(jié)構(gòu),接口清楚,便于對(duì)成員的精準(zhǔn)控制,使得細(xì)節(jié)得到隱藏。不僅如此,封裝還能夠?qū)?shù)據(jù)存取與權(quán)限問(wèn)題予以有效的解決,在封裝作用下能夠隱藏?cái)?shù)據(jù),營(yíng)造密閉空間,在該空間中設(shè)置數(shù)據(jù)訪問(wèn)權(quán)限。一個(gè)類中包含敏感數(shù)據(jù),有些人可以訪問(wèn),有些人不能訪問(wèn),如果不對(duì)這些數(shù)據(jù)的訪問(wèn)加以限制,后果將會(huì)非常嚴(yán)重。
減少代碼量,實(shí)現(xiàn)代碼復(fù)用。
消除類型之間的耦合關(guān)系;可替換性;可擴(kuò)充性;接口性;靈活性;簡(jiǎn)化性。
面向?qū)ο缶哂蟹庋b、繼承及多態(tài)三個(gè)特征。在封裝支持下,能夠保障數(shù)據(jù)安全性,并對(duì)編程進(jìn)行簡(jiǎn)化處理,在具體應(yīng)用中無(wú)需過(guò)分關(guān)注其細(xì)節(jié),在外部接口作用下,對(duì)類成員訪問(wèn)權(quán)限進(jìn)行設(shè)置。作為一種層次模型,繼承具有重復(fù)應(yīng)用的價(jià)值,能夠?qū)残苑椒ㄟM(jìn)行表述。派生類可和基類有同樣名字的成員,實(shí)現(xiàn)對(duì)基類成員的隱藏,基類方法及實(shí)例變量能夠得到相應(yīng)的繼承,并結(jié)合需求做出相應(yīng)的修改與增減。其多態(tài)性決定了不同類能夠?qū)崿F(xiàn)對(duì)同一消息的響應(yīng),對(duì)應(yīng)用程度函數(shù)同名問(wèn)題做出相應(yīng)的解決。