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