繼承,多態,封裝 在C#中,為了能夠合理描述自然界的規律,面向對象的編程引入了繼承的概念,是面向對象編程中最重要的概念之一,定義瞭如何根據現有的類創建新類的過程. 繼承:一個類派生出來的子類具有這個類所有的公共屬性和方法。 父類派生子類,子類繼承父類。 語法-- 子類:父類 子類和父類 被繼承的類稱 ...
繼承,多態,封裝
在C#中,為了能夠合理描述自然界的規律,面向對象的編程引入了繼承的概念,是面向對象編程中最重要的概念之一,定義瞭如何根據現有的類創建新類的過程.
繼承:一個類派生出來的子類具有這個類所有的公共屬性和方法。
父類派生子類,子類繼承父類。
語法-- 子類:父類
子類和父類
被繼承的類稱為父類或基類,繼承其他類的類稱為子類或派生類,子類不僅具有自己的獨有的成員,還有父類的成員。
Is a 的應用
在兩個類中建立繼承關係必須符合is a 的關係(例:小型卡車 is a 卡車,卡車is a 汽車,小型卡車is a汽車)
里氏替換原則:子類可以替換父類,但父類不可以替換子類對象。
只有當子類可以替換父類時,軟體功能不受影響,父類才能真正被覆用,而子類也能夠在父類的基礎上增加新的行為。
Is 和 as操作符的使用
Is 操作符用於檢查對象和制定的類型是否相容。
As 操作符主要用於兩個對象之間的類型轉換
繼承的特性
繼承有傳遞性(子類能派生子類)和單根性(一個子類不能同時繼承多個父類)
Base關鍵字和protected修飾符
base:表示父類,用於調用父類里的成員。
Protected:修飾父類成員,只允許子類調用和類的本身內部訪問,不允許其他非子類訪問。
修飾符的區別:
Public:任何類都可以訪問。
Private:任何類都不可以訪問。
Protected:只能由類的本身該類的子類內部訪問,其他任何類不可以訪問
子類構造函數:
任何子類都繼承父類的公共無參構造函數,父類的其他構造函數不會被繼承,只能在子類中聲明相同簽名的構造函數並用base顯示調用。
子類的構造函數肯定會調用父類的構造函數,先執行父類中的構造函數在執行子類中的構造函數。
隱式調用父類中的構造函數:
子類(沒有指明的情況下)調用父類中系統預設的一個無參構造函數。
顯示掉用父類中的構造函數
在子類指明的情況下用base關鍵字調用父類的某一個構造函數,實現屬性的初始化,然後在子類本身的構造函數中完成對子類特有的屬性初始化。如果子類沒有指明調用父類里手動創建的哪個構造函數時系統就會調用父類中手動創建的無參的構造函數,若是沒有系統將會報錯。
Public SE(string name); = Public SE(string name):base();
註:用base調用父類構造函數時,只能傳遞參數。
多態
多態:兩個或多個屬於不同類的對象,對於同一個消息(方法調用)作出不同響應的方式。
多態是建立在繼承的基礎上的,沒有繼承就沒有多態。
實現多態
以父類類型作為參數:可以接受他的子類類型,程式在運行中自動判斷實際參數屬於哪種子類,調用子類的方法從而實現多態。
我們通過虛方法和抽象方法在繼承的基礎上實現多態(通過重寫父類的方法,完成自己的方法)。
虛方法:實現方法重寫。通過關鍵字Virtual來定義一個虛方法(父類中),用Override修飾來重寫這個虛方法(子類中)。
語法:訪問修飾符 virtual 返回值類型 方法名()
{
//方法體
}
用虛方法 實現多態:
1.子類重寫父類的虛方法
兩種方式:1.創建父類變數用子類對象實例化這個父類變數
2.把父類類型作為參數,它的子類對象作為參數傳入
2.運行時,根據實際創建的對象決定執行哪個方法
抽象方法: 是一個沒有實現的方法,這些方法只能定義,通過在定義方法時加上關鍵字abstract可以聲明一個抽象方法(父類中),用Override來重寫這個抽象方法(重寫)。
語法:訪問修飾符 sbstract返回值類型 方法名();
註:抽象方法中沒有方法體。
抽象方法的應用:定義抽象方法必須在非抽象的子類中去實現,抽象方法必須定義在抽象類中。
抽象類:用sbstract修飾的類都是抽象類。抽象類是抽象的概念,抽象類提供抽象方法要求繼承他的子類去實現,通過這些抽象方法來約束子類的行為,有抽象的方法的類必然是抽象類,抽象類中不一定只能有抽象方法。
抽象類不能被實例化,也不能是密封和靜態的
抽象方法和虛方法都是通過override重寫父類的方法來實現多態。
註:重寫父類的語法:方法名、參數列表,返回值一樣
(方法重載是在一個類中完成,方法名相同,參數個數和參數類型不同,並且和返回值無關)
二者之間的區別:
抽象方法:
用abstract關鍵字修飾,
沒有方法體,
必須被override重寫,
只能在抽象類中寫。
虛方法:
用virtaul關鍵字修飾有方法體
可以被override重寫,
也可以不被override重寫
面向對象思想
封裝:保證對象自身數據的完整性和安全性。
繼承:建立類之間的關係,實現代碼復用,方便系統擴展。
多態:相同的方法調用可實現不同的實現方式。
面向對象高級應用
設計模擬式
在軟體工程中把對象的依賴性叫做耦合,而一個模塊內部各個元素彼此之間的聯繫叫做內聚。軟體工程中推崇“高內聚”,“低耦合”的設計。
設計模式概念:某些特定問題經過實踐檢驗的特定的解決方法。
設計模式就像古代的《三十六計》一樣。設計模式就是人們在軟體
開發中對一些經驗的總結。
面向對象設計模式是可復用面向對象軟體的基礎
簡單工廠設計模式:創建簡單工廠就是吧變化點封裝起來,在類的內部對代碼執行增加修改通過定義一個父類類型的方法返回父類類型子類對象,這個方法體內實例的子類根據方法傳的參數來進行創建。
簡單工廠設計模式降低了類與類之間的耦合性極大地減少了客戶程式的修改,使程式擴展性能大大增強(使客戶程式基本不需改動),但簡單工廠也有一定的局限性。
單例設計模式:將產生實例的方法在類部,通過一個靜態方法返回它的實例。(在類中把構造函數設為私有的)
私有構造函數:一種特殊的構造函數,通常只包含靜態成員的類中,如果一個類中只有私有的構造函數沒有公共得構造函數的話,則其他類將無法訪問該類的實例。
單例設計模式特點:
1. 私有構造函數。
2. 2.保存唯一的靜態的私有變數。
3. 獲取唯一實例的靜態方法。
應用單例設計模式:當類只能有一個實例存在,並且可以在全局訪問可以使用單例設計模式。
簡單工廠模式應用:簡單工廠模式試用於客戶程式不需要知道所創建的對象到底屬於哪個子類,所要創建的對象需要變化,因此把這些變化封裝到工廠之內。
軟體的設計以需求為基礎,所以要適當的情況下選用適當的設計模式。