面向對象對象三(四)大特征:封裝,繼承,多態,(抽象)
1_封裝
(1)封裝是指將數據(屬性)和行為(方法)組合在一個類中,并對外部隱藏對象的內部實現細節
(2)封裝的核心概念
數據隱藏:將類內部數據設為私有,只通過公共方法訪問
實現隱藏:隱藏類的內部實現細節,只暴露必要的接口
保護數據的完整性:通過方法控制對數據的訪問和修改
(3)屬性的封裝:將字段設為私有的,利用屬性控制字段的訪問
(4)方法的封裝:將方法寫在類中,通過類的實例或者類名調用方法
(5)封裝的好處:
數據保護:防止外部代碼直接修改對象內部的狀態
靈活性:可以修改內部實現而不影響使用該類的代碼
易于維護:將相關數據和操作組織在一起
減少耦合:類之間通過明確定義的接口交互
數據驗證:可以在設置屬性時添加驗證邏輯
2_繼承
(1)繼承允許我們基于現有的類創建新的類,實現代碼重用
(2)繼承的特點:
單繼承:c#只支持單繼承,一個類只能繼承一個父類
傳遞性:繼承關系可以多層傳遞
所有的類都繼承自object:即使沒有顯示指定,所有的類都隱式繼承自System.Object
(3)繼承中的訪問修飾符:
public
:任何代碼都可訪問protected
:只有類內部和派生類可訪問private
:只有類內部可訪問(默認)internal
:同一程序集內可訪問protected internal
:同一程序集或派生類可訪問
(4)繼承的基本語法:使用:
(5)子類的繼承函數:當調用子類的構造函數(無參和有參)時,會先調用父類的無參構造,想調用父類的有參構造,需要子類的有參構造使用base(參數),調用父類的有參構造
3_多態
(1)多態:同一個行為具有不同的表現形式和能力
(2)多態的分類:
編譯時多態(靜態多態):通過方法重載(Method Overloading)和運算符重載(Operator Overloading)來實現。
運行時多態(動態多態):通過繼承和接口,以及方法重寫來實現
(3)靜態多態在編譯過程中,通過方法重載和運算符重載來實現,也成為靜態綁定和早期綁定
動態多態在運行過程中,通過方法重寫,隱藏方法來實現,也稱之為動態綁定或者后期綁定
(4)方法重載:同一個函數名不同參數列表
(5)方法重寫:
通過virtual和override關鍵字實現
public class Shape
{public virtual void Draw(){Console.WriteLine("繪制一個形狀");}
}public class Circle : Shape
{public override void Draw(){Console.WriteLine("繪制一個圓形");}
}
通過new關鍵字實現
public class Shape
{public void Draw(){Console.WriteLine("繪制一個形狀");}
}public class Circle : Shape
{public new void Draw(){Console.WriteLine("繪制一個圓形");}
}
4_接口
(1)接口:使用java,asp.net等編寫的API接口。讓其他人通過相應的請求協議(如:http/https)來訪問。理解成“在接口服務器上定義多個方法,在客戶端上調用這些方法,這樣的一個過程,稱為請求接口。
(2)C#中的接口:定義一套規則,其他類實現規則。規則===》鍥約,合同。 接口必須實現,才能使用。接口也是多態性的表現。
5_類與方法
5.1 普通類:
(1)可以有實例成員,靜態成員 實例字段 靜態字段 實例方法 靜態方法 實例事件 靜態事件....不能由抽象方法
(2)訪問普通類的成員的時候,要先確定是靜態的還是非靜態(實例的);靜態 使用類名訪問;非靜態(實例的) 實例化對象訪問
5.2 靜態類
(1)普通類經過 stati 修飾之后 就會變成靜態類
(2)靜態類特點:
靜態類不能實例化,即不能new,訪問靜態類中的成員的時候,通過靜態類本身
靜態類內部不能有非靜態成員,只能由靜態成員
靜態類不支持繼承,不能繼承其他類,也不能被其它類繼承
靜態類中的構造函數必須是靜態的,而且不能有訪問修飾符
(3)靜態類作用:封裝工具類
5.3 抽象類
(1)抽象類和接口類似,都是為了制定一些規則,由子類去實現這些成員,而不是直接操作抽象類和接口
(2)能夠被其他的類繼承 也能繼承其他的類 但是它里面的抽象方法不能實現
(3)不能實例 抽象類設計出來就是用來被繼承的 和密封類是相對
(4)抽象類特點:
抽象類使用abstract 修飾
抽象類中可以實例成員,可以抽象成員 可以有靜態成員 可以有虛方法
抽象類不能實例化,抽象類定義了之后,一般不直接使用它,而是使用它的子類
抽象類只有被繼承,才有存在的意義
繼承抽象類的子類,必須實現抽象類中的抽象成員
5.4 密封類
(1)關鍵字 sealed,設計不讓其他類繼承,但可以繼承其他類,密封類中能包含 實例方法 靜態方法 不能包含抽象方法 虛方法 和密封方法
(2)特點
不能被繼承
可以實例化
可以有實例成員,靜態成員,不能有抽象成員和虛成員
5.5 抽象方法,虛方法,密封方法
(1)抽象方法(abstruct):抽象方法 不能實現 必須等待子類繼承后, 在子類中重寫 override;先占個位置 不去實現 等待子類實現;"空殼"
(2)虛方法(virtual):和抽象方法類似 ;虛方法可以有方法體,而且在子類中 不強制重寫;虛方法就是為了重寫的 是虛擬的 先占位 業務邏輯也可以先寫一點,將來在子類中重新實現業務邏輯;繼承過來的虛方法 可以重寫 也可以不重寫
(3)密封方法(sealed override):sealed 修飾成密封方法,不想在后續的子類中重寫;sealed 關鍵字應用在方法上的時候,必須和override 同時使用
必須是繼承自父類的方法使用sealed override重寫,并不希望后面的子類重寫該方法
public sealed ?override void SealedFn1(){base.SealedFn1();}
5.6 總結表格
特點\類型 | 普通類 | 靜態類 | 抽象類 | 密封類 |
---|---|---|---|---|
是否可以實例化 | 是 | 否 | 否 | 是 |
是否可以被繼承 | 是 | 否 | 是 | 否 |
是否可以繼承其他類 | 是 | 否 | 是 | 是 |
是否有普通成員 | 是 | 否 | 是 | 是 |
是否可以有靜態成員 | 是 | 是 | 是 | 是 |
是否可以有抽象成員 | 否 | 否 | 是 | 否 |
是否可以有虛成員 | 是 | 否 | 是 | 否 |