標籤:
1.什麼是巢狀型別:在類和結構內部定義的類型稱為巢狀型別,例如
1 class Container2 {3 class Nested4 {5 Nested() { }6 }7 }
2.不管外部類型是結構還是類。巢狀型別修飾符預設為private,可以設定為其他的修飾符,巢狀型別對外部類型是不可訪問的 ,可以設定為public。
class Container{ public class Nested { Nested() { } }}
3.巢狀型別(或內部類型)可訪問包含類型(或外部類型)。若要訪問包含類型,請將其作為建構函式傳遞給巢狀型別,不受外部類的修飾符限制例如:
public class A { private int _a; /*嵌套類 定義*/ private class NestedA { public NestedA(A a) { a._a = 9; } } }View Code
public class Container{public class Nested{private Container m_parent;public Nested(){}public Nested(Container parent){m_parent=parent;}}}View Code
public class A { private static int _AInt; private int _instanceInt; private static void AMethod() { Console.WriteLine(_AInt); } public void SayIt() { NestedA.Method(this); } /*嵌套類 定義*/ private class NestedA { public static void Method(A a) { //靜態成員 _AInt = 100; AMethod(); //執行個體成員 a._instanceInt = 10; a.SayIt(); } } }View Code
但是外部類只能夠存取修飾詞為public、internal嵌套類的欄位、方法、屬性。樣本如下:
public class A { public static void AMethod() { //成功 NestedA.StaticMethod(); //編譯報錯 NestedA._Int = 100; NestedA ins=new NestedA(); //成功 ins.Method(); //編譯報錯 ins._instanceInt = 100; } /*嵌套類 定義*/ private class NestedA { private static int _Int; private int _instanceInt; public static void StaticMethod() { } public void Method(){} } }View Code
繼承:
繼承類,也就是繼承類外部類的類,只能使用父類中嵌套類的public或者internal(同一個程式集合)方法。但是繼承類可以再定義一個內嵌類並從繼承父類中嵌套類。如:
public class A{ /*嵌套類 定義*/ protected class Nested { protected virtual void BaseNested_Method(){} }} public class C : A{ /*內嵌類 定義*/ protected class C_Nested:Nested { protected override void BaseNested_Method() { //重寫部分 } } }View Code
因為C中A中繼承,因此C_Nested可以繼承Nested類,從而擷取重寫父嵌套類的機會。但是Nested必須是可繼承類及可訪問的(非private 、sealed、static)。
嵌套類可以隨意外部類的任何資料屬性,而外部類訪問嵌套類就只能遵守存取修飾詞。從這個角度看,嵌套類是外部類的補充,通過嵌套類可以擷取更好的封裝性,增加外部類的可維護性和可讀性。
巢狀型別可訪問包含類型的私人成員和受保護的成員(包括所有繼承的私人成員或受保護的成員)。
在前面的聲明中,類 Nested 的完整名稱為 Container.Nested。這是用來建立嵌套類的新執行個體的名稱,如下所示:
Container.Nested nest = new Container.Nested();
C#巢狀型別