.NET 面向對象基礎
封裝
對象的內部數據不應該從對象的實例直接訪問,如果調用者想改變對象的狀態就要使用訪問方法(getter)和修改方法(setter),封裝提供了一種保護狀態數據完整性的方法,可用于驗證輸入數據是否符合業務規則。
- 實現方式
- 訪問方法和修改方法
- 屬性
繼承
新的類可以從其他類中繼承利用他們既有的功能。這是通過以下方式實現的:在聲明類時,在類名稱后放置一個冒號,然后在冒號后指定要從中繼承的類(即基類)。
- 語法
- public class A
- {
- public A() { }
- }
- public class B : A
- {
- public B() { }
- }
- 代碼重用
- is-a:繼承
- has-a:包含、委托模型
- 基類
一個類只能有一個直接的基類,子類將繼承基類的所有非私有功能,但可以繼承多個接口,這樣可以構造靈活的接口層次來建模復雜的行為。
- 初始化調用
默認在子類的構造函數執行之前調用基類的構造函數,之后為基類的公共屬性創建狀態。實現子類時最好是顯示的調用合適的基類的構造函數,減少對繼承的初始化成員的調用次數。
- 關鍵字
- base:子類需要調用基類的字段或方法時可以使用該關鍵字
- 密封類
密封類是不可以被繼承的,在設計工具類時對類進行密封是很有意義的
- 關鍵字
- sealed
- 代碼示例
- public sealed class D
- {
- // Class members here.
- }
- 嵌套類
在類或結構內部定義的類型稱為嵌套類型,不管外部類型是類還是結構,嵌套類型均默認為 private,但是可以設置為 public、protected internal、protected、internal 或 private。嵌套類型(或內部類型)可訪問包含類型(或外部類型)。
- 語法
- class Container
- {
- class Nested
- {
- Nested() { }
- }
- }
- 訪問包含類型
將其作為構造函數傳遞給嵌套類型
- public class Container
- {
- public class Nested
- {
- private Container m_parent;
- public Nested()
- {
- }
- public Nested(Container parent)
- {
- m_parent = parent;
- }
- }
- }
- 實例化
多態
通過繼承,一個類可以用作多種類型:可以用作它自己的類型、任何基類型,或者在實現接口時用作任何接口類型。這稱為多態性。C# 中的每種類型都是多態的。類型可用作它們自己的類型或用作 Object 實例,因為任何類型都自動將 Object 當作基類型。
- 方法重寫
由子類重新定義基類中的方法,可使用base關鍵字調用基類的方法
- 關鍵字
- virtual:基類中的需要子類實現的方法可以使用該關鍵字
- override:派生類需要實現基類中的方法可以使用該關鍵字
- 成員投影
如果子類中定義了一個成員與基類的成員一致,則我們稱之為成員投影。可以使用new關鍵字調用新成員而不是被替換的舊成員,將子類實例強制轉換成基類實例時才可以調用隱藏的基類成員。一般在無法更改基類代碼的情況下可以使用此方法進行成員替換。
- 關鍵字
- new
- 密封虛成員
用于密封從基類繼承的虛方法,以防止本類的派生類重寫此方法。
- 關鍵字
- sealed:使用 sealed 關鍵字可以防止繼承以前標記為 virtual 的類或某些類成員。
- 代碼示例
- public class D : C
- {
- public sealed override void DoWork() { }
- }
抽象類
- 關鍵字
- abstract :使用 abstract 關鍵字可以創建僅用于繼承用途的類和類成員,即定義派生的非抽象類的功能。
- 抽象方法
抽象類也可以定義抽象方法。方法是將關鍵字 abstract 添加到方法的返回類型的前面。抽象方法沒有實現,所以方法定義后面是分號,而不是常規的方法塊。抽象類的派生類必須實現所有抽象方法。當抽象類從基類繼承虛方法時,抽象類可以使用抽象方法重寫該虛方法。
- 代碼示例
- public abstract class A
- {
- public abstract void DoWork(int i);
- }
- 虛方法聲明為抽象
如果將虛方法聲明為抽象方法,則它對于從抽象類繼承的所有類而言仍然是虛的。繼承抽象方法的類無法訪問該方法的原始實現。在前面的示例中,類 F 上的 DoWork 無法調用類 D 上的 DoWork。在此情況下,抽象類可以強制派生類為虛方法提供新的方法實現。
- // compile with: /target:librarypublic class D
- {
- public virtual void DoWork(int i)
- {
- // Original implementation.
- }
- }
- public abstract class E : D
- {
- public abstract override void DoWork(int i);
- }
- public class F : E
- {
- public override void DoWork(int i)
- {
- // New implementation.
- }
- }
- 多態接口
- 基類和派生類的轉換規則
- 規則一:可以使用基類保存任意的派生類型,并且這是安全的,這叫做隱式轉換。
- 規則二:反之,需要使用強制轉換操作符進行顯示的向下轉換。