巢狀類(nested class)是在類中定義的類。以下把擁有內嵌類的類稱為外部類。巢狀類分為靜態巢狀類和非靜態巢狀類,其中非靜態巢狀
類也被稱為內部類。巢狀類在uml中是composite的另外一種**表示形式,表示耦合度更高,並且與外部類更加緊密。
一般類的訪問修飾符可以定義為預設的internal或者public,而內嵌類就有比較多的選擇,可以是為protected、internal、public以及預設的private。
內嵌類與外部類的訪問限制
巢狀類可以訪問外部類的方法、屬性、欄位而不管訪問修飾符的限制。如:
public class a
public void sayit()
private class nesteda}}
但是外部類只能夠訪問修飾符為public、internal巢狀類的字段、方法、屬性。示例如下:
public class a
private class nesteda
public void method(){}}}
巢狀類訪問外部類例項的方法、字段、屬性時候。一般在採取建構函式輸入外部類。如下:
public class a
}}繼承
繼承類,也就是繼承類外部類的類,只能使用父類中巢狀類的public或者internal(同乙個程式集合)方法。但是繼承類可以再定義乙個內嵌類
並從繼承父類中巢狀類。如:
public class a}}
public class c : a}}
因為c中a中繼承,因此c_nested可以繼承nested類,從而獲取重寫父巢狀類的機會。但是nested必須是可繼承類及可訪問的(非private 、sealed、static)。
巢狀類可以隨意訪問外部類的任何資料屬性,而外部類訪問巢狀類就只能遵守訪問修飾符。從這個角度看,巢狀類是外部類的補充,通過巢狀類可以獲取更好的封裝性,增加外部類的可維護性和可讀性。
從程式結構看,巢狀類在邏輯上更加接近使用類。可以更有效地表示類與類之間的緊密程度。為類管理提供除命名空間外的另一種方法。
懶載入
巢狀類的靜態建構函式不會隨著外部類的觸發而初始化。因此可以有效地避免建立時候初始化時間,當需要使用內嵌類的時候,巢狀類才開始初始化。
public class outside
public void sayit()
private class nested
public static void run()}}
執行結果
outside o = new outside(); //列印"outside inilizlized"
console.readline();
o.sayit();//首先列印"nested initilized" 再列印 "nested run"
console.readline();
一般應用這個特性會在一些c#單例模式中找到,而這種模式可以被稱為fully lazy singleton模式。下面是簡單的演示**(singleton模式可以在這裡有更加詳細的解釋):
public class singleton
}private class nested}
反射
反射內嵌類需要使用"+"而不是我們常使用的"." ,如a類在名稱為insideclass的assembly中。
namespace insideclass}}
} 執行
//成功
object o1 = system.activator.createinstance("insideclass", "insideclass.a+nested");
//失敗 丟擲system.typeloadexception異常
object o2 = system.activator.createinstance("insideclass", "insideclass.a.nested");
C 類的巢狀
巢狀類 nested class 是在類中定義的類。以下把擁有內嵌類的類稱為外部類。巢狀類分為靜態巢狀類和非靜態巢狀類,其中非靜態巢狀類也被稱為內部類。巢狀類在 uml中是composite的另外一種 表示形式,表示耦合度更高,並且與外部類更加緊密。一般類的訪問修飾符可以定義為預設的internal...
C 巢狀類的學習
巢狀類,這裡指的是語法上的巢狀類,實際上是平行的關係。外圍類需要使用巢狀類物件作為底層實現,並且該巢狀類只用於外圍類的實現且同時可以對使用者隱藏該底層實現。include using namespace std class outer public inner obj void fun 巢狀類為外圍...
C 類入門3 巢狀類
可以將類b宣告在另乙個類中。在另乙個類a中宣告的類b被稱為巢狀類 nested class 類a的成員函式可以建立和使用巢狀類b的物件。當且僅當宣告為公有部分時,才能在類a的外面使用巢狀類。而且必須使用作用域解析運算子。舊版c 不支援巢狀類概念 對類進行巢狀和包含並不同。包含意味著將類c物件作為類a...