眾所周知,面向對象編程的特點為:封裝、繼承、多態。C#是一門完全面向對象的語言,由于比Java推出的時間還要晚,所以對面向對象的思想的體現比Java還要完美,那么在C#中如何體現封裝、繼承和多態呢?下面舉例并進行說明。
1.封裝
封裝的好處有以下幾點:
①數據不外泄,可以做到一定的保護
②類的使用者不用考慮具體的數據運算,方便
③程序結構性強,層次清晰,便于維護
對相關的字段、方法進行封裝固然對面向對象編程起到不可缺少的重要作用,但并不代表不可以訪問類或者說具體的實例化對象中的內容,而且為使用者提供接口,僅僅讓他們調用就可以了,他們只做他們的工作,不需要考慮或者顧及你寫的類具體是做什么的,更不用考慮你寫的每一行代碼是什么意思。
在C#中,對于變量的封裝,往往將需要被在本類以外調用的,以屬性的形式出現,而不像C++中是直接以public成員或者private成員加上相關的方法調用,那樣要么不符合面向對象的特點,要么太麻煩。
C#中屬性的聲明:
C#對方法的封裝只需要改變方法的訪問級別,比如設為public,或者設為private(或者不寫),對應的就是可從外部訪問以及僅能從內部訪問。
2.繼承
大家都知道繼承機制可以提高代碼的可復用性和可擴展性,以提高開發效率,減少代碼量。C#和C++不同,可從一個類繼承或實現多個接口,但不可以從多個類繼承。
繼承語法示例:
C#所有的類都繼承自System.Object,所以不管是什么類都有幾個固定的、公共的方法,這是C#體現面向對象思想非常不錯的一點!
下來說一下靜態類的特征:
①靜態類不能使用sealed或abstract修飾符
②靜態類必須直接繼承自System.Object,不能是其他
③靜態類不能實現任何接口
④靜態類不能包含任何操作符
⑤靜態類不能包含使用protected或protected internal修飾的靜態成員
⑥靜態類智能包含靜態成員
⑦靜態類可以包含靜態構造函數,但不能包含實例構造函數
⑧靜態類不能被實例化
⑨靜態類是密封的,不能被繼承
由于靜態類是在加載包含該類的程序集時由CLR自動加載,所以用靜態類實現一些不操作數據,并且不與代碼中的特定對象關聯的方法是非常不錯的選擇。
剩下要注意的就是在使用繼承的時候,搞清構造函數的調用順序,先初始化類的實例字段,再調用基類構造函數,最后調用自己的構造函數。
3.多態
通過基類的引用調用在派生類中實現的方法時,不同的派生類將產生不同的調用結果,這就是多態,而C#中的多態分為運行時多態和編譯時多態。編譯時多態利用函數重載實現,運行時多態通過覆寫虛方法實現。
①方法重載
前提:在同一個類中,方法名相同,方法簽名不同(包括方法的名稱及參數信息(形參的修飾符、數目、類型以及泛型參數的數目),但返回值類型、形參和類型參數的名稱并不屬于方法簽名的一部分)
方法重載示例:
②虛方法
定義虛方法需要使用virtual關鍵字,如下所示:
注意:virtual關鍵字必須位于返回方法的返回類型之前,虛方法可以有方法體,而抽象方法不允許有方法體
剩下兩項注意:靜態成員函數不能是虛函數,構造函數不能是虛函數
覆寫方法示例:
具體的例子就不舉了
4.總結
所有的面相對象思想,歸根結底是為了簡化代碼,減少代碼量,構建更符合現實生活邏輯的程序代碼,從而減輕程序員的負擔。不能一味地或者說刻意地去使用面相對象的思想而忽略了程序所實現的功能或者框架,要根據實際情況,合理利用面相對象思想,減輕負擔,并為他人提供方便!
新聞熱點
疑難解答