【轉載】C# 內部類
阿新 • • 發佈:2018-12-26
C#語言有很多值得學習的地方,這裡我們主要介紹C#內部類,包括介紹instance方法和private方法等方面。
C#內部類能夠使用外部類定義的型別和靜態方法,但是不能直接使用外部類的例項方法,直接看來,外部類對於內部類的作用更像是一個名稱空間,在C#中,始終可以用(只要訪問控制允許)
Sys.Model.Key key = new Model.Key();
來建立一個內部類的例項,這個例項與外部類的任何例項沒有任何直接的關係。類似於Java中的靜態內部類。
在C#中,類區分為Nested Class和Not-Nested Class,前者是宣告在其他資料型別內部的類。後者是直接定義在某一個名稱空間的類。非內嵌類只允許使用public和internal的訪問控制,而內建類則允許使用所有的五種訪問控制符
(1)private; (2) protected; (3) internal; (4)protected; (5)public
內部類也可以訪問外部類的所有方法,包括instance方法和private方法,但是需要顯式的傳遞一個外部類的例項。
建立內部類的一個目的是為了抽象外部類的某一狀態下的行為,或者C#內部類僅在外部類的某一特定上下文存在。或是隱藏實現,通過將內部類設為private,可以設定僅有外部類可以訪問該類。內部類的另外一個重要的用途是當外部類需要作為某個特定的類工作,而外部類已經繼承與另外一個類的時候,因為C#不支援多繼承,所以建立一個對應的內部類作為外部類的一個facecade來使用。二:
(1)抽象外部類的某一狀態下的行為,隱藏實現,通過修改該內的訪問修飾符,可以設定僅有外部類可以訪問該類。
(2)擴充套件了名稱空間,可以將外部類的類名作為內部類的一個名稱空間(這裡只是相當於,但不是真正的名稱空間)。
(3)內部類可以當作外部類的一個擴充套件,可以活的更好的封裝。
上面的這些特點胡亂的總結了一下,可能有些詞不達意,下面有些具體例子:
1.內部類的定義:
巢狀類:在一個類中定義另外一個類,主要分為靜態巢狀類和非靜態巢狀類(又稱之為"內部類")。內部類的定義結構:
(1)在一個類中直接定義類。
(2)在一個方法中定義類。
(3)匿名內部類。
2.外部類訪問內部類
外部類訪問內部類 例子
namespace GameStatistical.Test.InnerClass
{
public class Person
{
public class Student
{
public static int age;
internal static int height;
private static string sex;
public virtual void Show()
{
Console.WriteLine("年齡:"+age);
Console.WriteLine("身高:"+height);
}
internal void Display()
{
Console.WriteLine("internal");
Console.WriteLine("年齡:" + age);
Console.WriteLine("身高:" + height);
}
}
public void Show()
{
Student.age = 21;
Student.height = 75;
Student student = new Student();
student.Show();
}
}
}
該段程式碼定義了一個外部類Person 和一個內部類Student, 其中內部類Student中使用了各種修飾符修飾的變數和方法,從上面的例子可以看出外部類只能夠訪問巢狀類中修飾符為public、internal的欄位、方法、屬性。呼叫外部類的 Show()方法執行得到如下結果:
3.內部類訪問外部類
namespace GameStatistical.Test.InnerClass
{
public class Person1
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private string sex;
public string Sex
{
get { return sex; }
set { sex = value; }
}
public void Show1()
{
Console.WriteLine(this.name + "==>" + this.sex);
}
private static void Show2()
{
Console.WriteLine("===================>");
}
internal void Show3()
{
Console.WriteLine(this.name + "==>" + this.sex);
}
public class Student
{
public void SetPer(string name, string sex)
{
Person1 p = new Person1();
p.name = name;
p.sex = sex;
p.Show3();
p.Show1();
}
}
}
}
這段程式碼同樣定義了一個外部類Person1 和一個內部類Student,內部類中的SetPer()呼叫了外部類中的方法,寫這段程式碼我們可以發現 巢狀類可以訪問外部類的方法、屬性、欄位而不受訪問修飾符的限制
4.內部類的繼承
內部類繼承例子1
namespace GameStatistical.Test.InnerClass{
public class Person
{
public class Student
{
public static int age;
internal static int height;
private static string sex;
public virtual void Show()
{
Console.WriteLine("年齡:"+age);
Console.WriteLine("身高:"+height);
}
internal void Display()
{
Console.WriteLine("internal");
Console.WriteLine("年齡:" + age);
Console.WriteLine("身高:" + height);
}
}
public void Show()
{
Student.age = 21;
Student.height = 75;
Student student = new Student();
student.Show();
student.Display();
}
}
}
內部類繼承,上面的內部類定義了父類,其中public virtual void Show() 使用virtual 修飾,可以用於子類重寫這個方法,看內部類繼承子類是否能夠重寫這個方法。
內部類繼承例子2
namespace GameStatistical.Test.InnerClass
{
public class SubPerson:Person
{
public class SubStudent : Student
{
public override void Show()
{
base.Show();
}
}
}
}
上面的程式碼重寫了Show() 這個方法,說明內部類的繼承可以通過
5.反射內部類
對於這段程式碼,是從其他網站看到的,反射內部類我們不能直接通過 "." 操作符直接來操作,而是通過 "+" 操作符。前面也提到過內部類也是一種有效的管理名稱空間的方法,這裡也是普通類和內部類的一點區別:反射內部類
Activator.CreateInstance("GameStatistical.Test.InnerClass","GameStatistical.Test.InnerClass.ReflectionPerson+Student");
反射普通類Activator.CreateInstance("GameStatistical.Test.InnerClass", "GameStatistical.Test.InnerClass.ReflectionPerson.Student");
在實際操作中,內部類好像使用的比較少,這裡也只是非常簡單的介紹,作為一個知識點總結起來。