C#基礎回顧--面向物件
什麼是面向物件
面向物件是一種對現實世界理解和抽象的方法。實現過程就是將現實的物件抽象成類/介面等,通過例項化出來的物件進行互動(呼叫)實現功能。
簡單的理解就是,物件是類的例項化,面向物件就是面向類的例項化,類則是我們對現實事物/業務的抽象
面向物件的三大特徵
1)封裝
封裝是指將現實事物/業務物件抽象成系統類/介面的過程。
封裝的類只提供必要的共有屬性/函式,將私有資訊定義為私有訪問級別,外部無法訪問。封裝物件的屬性/方法的訪問級別由訪問修飾符定義。
- public:所有物件都可以訪問;
- private:物件本身在物件內部可以訪問;
- protected:只有該類物件及其子類物件可以訪問
- internal:同一個程式集的物件可以訪問;
- protected internal:訪問限於當前程式集或派生自包含類的型別。
2)繼承
子類自動共享父類資料結構和方法。
何時使用繼承?
1、子類可以完全繼承父類資訊,而不至於影響子類功能,並且父類的資訊對子類是必要的。
2、當多個類擁有共同的屬性/方法,並且其功能相近時,我們可以將共同的屬性/方法提升,構建共同的父類。
例如
public class BaseController:ControllerBase { /// <summary> /// 獲取通用的成功結果 /// </summary> ///<returns></returns> protected object GetSuccessResult() { //TODO generate success result return null; } /// <summary> /// 獲取通用的失敗結果 /// </summary> /// <returns></returns> protected object GetFailureResult() {//TODO generate failure result return null; } }
3)多型
1、過載(overload): 在同一個作用域(一般指一個類)的兩個或多個方法函式名相同,引數列表不同的方法叫做過載,它們有三個特點:
- 方法名必須相同
- 引數列表必須不相同
- 返回值型別可以不相同(返回值不同,引數列表一樣,方法名一樣,這是不可以的)
2、重寫(override):子類通過override關鍵字重寫父類的虛方法或者抽象方法。子類物件賦值給父類變數,父類呼叫子類過載的方法時,實際執行的是子類重寫的方法(不是父類本身的方法)。其特徵就是子類的重寫的方法與父類方法定義是一樣,只是多了override進行修飾。
3、重建/隱藏(new):子類通過new關鍵字重建與父類同名同參數列表的方法。子類物件賦值給父類變數,父類呼叫子類重建的方法時,實際呼叫的是父類方法(注意這點與重寫的區別)
類、抽象類、介面
類
類是對具有相同屬性的事物的抽象封裝。類的例項化則是物件。
抽象類
抽象類是指用abstract進行修飾的類,抽象類不能例項化(抽象類可以不包含抽象方法和抽象屬性,但是此時它宣告為抽象類其實是毫無意義的)。
抽象類特徵:
- 抽象類可以包含抽象方法和抽象訪問器。
- 抽象類不能例項化
- 不能用 sealed 修飾符修改抽象類,這意味著該類不能被繼承。
- 從抽象類派生的非抽象類必須實現包括繼承的所有抽象方法和抽象訪問器,否則編譯報錯。
介面
介面(interface)用來定義一種程式的協定。實現介面的類的協定(方法,索引器,屬性,事件)必須與介面的定義嚴格一致(類可以進行擴充套件,不是要求只能是實現介面)。
- 介面不可例項化
- 介面可以包含方法、屬性、事件和索引器。
- 介面本身不提供它所定義的成員的實現。它只指定實現該介面的類或介面必須提供的成員。
抽象類與介面最大的區別在於抽象類可以包含具體的實現,介面是定義一種協定、規範。所以我們在什麼情況下使用介面,什麼情況下使用抽象類也就很明顯了:當同類事物擁有相同屬性較多時,我們就可以定義為對應的抽象類;如果我們需要的是協定、規範時則定義介面。
一個類可以實現多個介面,但是隻能直接(間接是可以繼承多個的)繼承一個類