1.基本概念
嵌套類:在一個類中定義另一個類,分為靜態嵌套類(使用少)和非靜態嵌套類(又稱內部類)。
內部類: (1) 在一個類中直接定義類。
(2) 在一個方法中定義類。
(3) 匿名內部類。
2. 嵌套類的使用
(1)外部類只能夠訪問嵌套類中修飾符為public、internal的字段、方法、屬性。示例如下
public class Animal
{
static void Set_Animal()
{
//編譯正確
Monkey._high = 123;
Monkey._age = 4;
//編譯失敗
Monkey._name = "hoho";
}
private class Monkey
{
private static string _name;
protected string _sex;
internal static int _age;
public static int _high;
public Monkey() { }
public void show()
{ }
}
}
(2)嵌套類可以訪問外部類的方法、屬性、字段而不受訪問修飾符的限制
public class Animal
{
private static int _Age;
private string name;
private static void DoSomething()
{
Console.WriteLine(_Age);
}
private void DoStr()
{
monkey.method(this);
}
/*嵌套類 定義*/
class monkey
{
public static void method(Animal a)
{
_Age = 23; //靜態成員
a.name = "test"; //實例成員
}
}
}
3. 嵌套類訪問外部類實例的方法、字段、屬性時候。一般在采取構造函數輸入外部類
public class Animal
{
private string _name;
//*嵌套類 定義*/
class monkey
{
public monkey(Animal a)
{
a._name = "test";
}
}
}
4.繼承類可以再定義一個內嵌類並從繼承父類中嵌套類
public class Animal
{
//*嵌套類 定義*/
protected class monkey
{
public virtual void Method()
{
Console.WriteLine("monkey");
}
}
}
public class S_Animal : Animal
{
class s_monkey :monkey
{
public override void Method()
{
Console.WriteLine("s_monkey");
}
}
}注:因為S_Animal 繼承於Animal ,因此s_monkey可以繼承monkey類,從而獲取重寫父嵌套類的機會。
但是monkey必須是可繼承類及可訪問的(非private 、sealed、static)。
嵌套類可以隨意外部類的任何數據屬性,而外部類訪問嵌套類就只能遵守訪問修飾符。從這個角度看,嵌套類是外部類的補充,
通過嵌套類可以獲取更好的封裝性,增加外部類的可維護性和可讀性。
從程序結構看,嵌套類在邏輯上更加接近使用類。可以更有效地表示類與類之間的緊密程度。為類管理提供除命名空間外的另一種方法。
5.單例模式(singleton)就采用一種為 延遲加載初始化實例 的方法如下:
public class Animal
{
public Animal(){}
public static Animal Intance
{
get { return monkey._intance; }
}
class monkey
{
public readonly static Animal _intance = new Animal();
}
}注: 延遲加載 嵌套類的靜態構造函數不會隨着外部類的觸發而初始化。因此可以有效地避免創建時候初始化時間,
當需要使用內嵌類的時候,嵌套類才開始初始化才開始初始化。
6.反射內嵌類需要使用"+"而不是我們常使用的"." 。
namespace AnimalClass
{
public class Animal
{
public class monkey
{
protected void Method()
{
//do something...
}
}
}
} 注://成功
object o1 = System.Activator.CreateInstance("AnimalClass", "AnimalClass.Animal+monkey");
//失敗 拋出System.TypeLoadException 異常
object o2 = System.Activator.CreateInstance("AnimalClass", "AnimalClass.Animal.monkey");