C#是純面向對象的編程語言,運用面向對象的思想對於編寫一個大型工程就顯得非常重要。和其他的面向對象語言一樣,C#也主要是通過封裝(encapsulating)、繼承(inheritance)和多態(polymorphism)來實現。
(一)封裝
客戶希望在不使用方法的情況下訪問對象的狀態,但是類的設計者卻想將類的狀態隱藏在類成員中而讓客戶只能通過方法間接訪問對象的狀態。屬性滿足了這兩個目的: 通過屬性(properties)來封裝數據,為客戶提供簡單的“類似成員變量”的接口;同時為設計者提供了“使用方法來實現”的OO設計所必須的數據隱藏性。
通過上一篇博客所講的get與set控制器我們可以定義一些存儲屬性的私有成員,例如:
可以在get和set前加一些修飾符,如:protected,internal,private,但使用修飾符時,必須get和set訪問方法都存在,且只能修飾其中之一。並且修飾符的訪問級別要低於屬性或索引器的訪問級別。internal關鍵字是類型和類型成員的訪問修飾符。只有在同一個程序集的文件中,內部類型或者是成員才可以訪問。
有時需要使用靜態構造方法初始化,但又不希望數值被改變的時候使用關鍵字readonly。
(二)繼承
在面向對象的編程中,有兩種截然不同的繼承類型:實現繼承和接口繼承。
實現繼承:表示一個類型派生於一個基類型,它擁有該基類型的所有成員字段和函數。在實現繼承,派生類型采用基類型的每個函數的實現代碼,除非在派生類型的定義中指 定重寫某個函數的實現代碼。在需要給現有的類型添加功能,或許多相關的類型共享一組重要的公共功能時,這種類型的繼承非常有用。
接口繼承:表示一個類型只繼承了函數的簽名,沒有繼承任何實現代碼 。在需要指定該類型具有某些可用的特性時,最好使用這種類型的繼承。
一些語言(如C++)支持所謂的 “多重繼承”,即 一個類派生自多個類。C#不支持多重實現繼承。而C#又允許類型派生自多個接口:多重接口繼承。這說明,C#可以派生自另一個類和任意多個接口。更准確地說,因為 System.Object是一個公共的基類,所以每個C#類(除了Object類之外)都有一個基類,還可以有任意多個基接口。
實現繼承:
如果要聲明派生自另一個類的一個類,就可以使用下面的語法(基類放冒號后面):
這個語法非常類似於C++ 和 Java 中的語法,但是,C++程序員習慣於使用公共和私有繼承的概念,要注意不支持私有繼承,因此在基類名上沒有public 或 private限定符。支持私有繼承只會大大增加語言的復雜性。
如果類(或結構)也派生自接口,則用逗號分隔列表中的基類和接口:
把一個基類函數聲明為virtual,就可以在任何派生類中重寫該函數:
抽象類和抽象函數:
C#允許把類和函數聲明為abstract。抽象類不能實例化,而抽象函數不能直接實現,必須在非抽象的派生類中重寫。顯然,抽象函數本身也是虛擬的(盡管也不需要提供 virtual關鍵字,實際上,如果提供了該關鍵字,就會產生一個語法。如果類包含抽象函數,則該類也是抽象的,也必須聲名為抽象的:
(三)多態
繼承有兩各方面的作用最為強大,一方面可以讓代碼有很強的重用性,另一方面就是多態。
多態就是:允許將子類類型的指針賦值給父類類型的指針。也就是同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法。
理解多態之前首先要對面向對象的里氏替換原則和開放封閉原則有所了解。
里氏替換原則(Liskov Substitution Principle):
派生類(子類)對象能夠替換其基類(超類)對象被使用。通俗一點的理解就是“子類是父類”,當需要一個父類類型的對象的時候可以給一個子類類型的對象;當 需要一個子類類型對象的時候給一個父類類型對象是不可以的!
開放封閉原則(Open Closed Principle):
封裝變化、降低耦合,軟件實體應該是可擴展,而不可修改的。也就是說,對擴展是開放的,而對修改是封閉的。因此,開放封閉原則主要體現在兩個方面:對擴 展開放,意味着有新的需求或變化時,可以對現有代碼進行擴展,以適應新的情況。對修改封閉,意味着類一旦設計完成,就可以獨立完成其工作,而不要對類進 行任何修改。
我們先來看下怎樣用虛方法實現多態:
創建基類Bird如下,添加一個虛方法Eat():
創建子類Magpie如下,繼承父類Bird,重寫父類Bird中的虛方法Eat():
創建一個子類Eagle如下,繼承父類Bird,重寫父類Bird中的虛方法Eat():
到此,一個基類,兩個個子類已經創建完畢,接下來我們在主函數中來看下多態是怎樣體現的:
這樣就會顯示各類相應的內容了。
除了通過虛方法實現多態,還有另外兩種方法,即利用抽象或者接口來實現多態,在這里就先不介紹了,大家可以查閱相關資料學習這兩種實現多態的方法。
關於C#面向對象編程我們就先介紹到這,下一篇博客為大家介紹C#的字符串與正則表達式。