c# 中內部類的簡單介紹
最近在看java一方面的書籍,看到一個很奇怪的問題,java類中還可以再定義一個類,這種結構非常特殊!後來才發現我知識淺薄了,原來C#中也有內部類,之前都一直沒有注意過這個語法結構!
使用內部類有這樣幾個好處:
(1)抽象外部類的某一狀態下的行為,隱藏實現,通過修改該內的訪問修飾符,可以設定僅有外部類可以訪問該類
(2)擴充套件了名稱空間,可以將外部類的類名作為內部類的一個名稱空間(這裡只是相當於,但不是真正的名稱空間)
(3)內部類可以當作外部類的一個擴充套件,可以活的更好的封裝。
上面的這些特點胡亂的總結了一下,可能有些詞不達意,下面有些具體例子:
1.內部類的定義:
巢狀類:在一個類中定義另外一個類,主要分為靜態巢狀類和非靜態巢狀類(又稱之為"內部類")
內部類的定義結構:(1)在一個類中直接定義類(2)在一個方法中定義類(3)匿名內部類
2.外部類訪問內部類
1 namespace GameStatistical.Test.InnerClass2 {
3 publicclass Person
4 {
5 publicclass Student
6 {
7 publicstaticint age;
8 internalstaticint height;
9 privatestaticstring sex;
10 11 publicvirtualvoid Show()
12 {
13 Console.WriteLine(
14 Console.WriteLine("身高:"+height);
15 }
16 17 internalvoid Display()
18 {
19 Console.WriteLine("internal");
20 Console.WriteLine("年齡:"+ age);
21 Console.WriteLine("身高:"+ height);
22 }
23 }
24
27 {
28 Student.age =21;
29 Student.height =75;
30 Student student =new Student();
31 student.Show();
32 student.Display();
33 }
34 }
35 }
該段程式碼定義了一個外部類Person 和一個內部類Student, 其中內部類Student中使用了各種修飾符修飾的變數和方法,從上面的例子可以看出外部類只能夠訪問巢狀類中修飾符為public、internal的欄位、方法、屬性。
呼叫外部類的 Show()方法執行得到如下結果:
3.內部類訪問外部類
1 namespace GameStatistical.Test.InnerClass2 {
3 publicclass Person1
4 {
5 privatestring name;
6 7 publicstring Name
8 {
9 get { return name; }
10 set { name = value; }
11 }
12 privatestring sex;
13 14 publicstring Sex
15 {
16 get { return sex; }
17 set { sex = value; }
18 }
19 20 publicvoid Show1()
21 {
22 Console.WriteLine(this.name +"==>"+this.sex);
23 }
24 25 privatestaticvoid Show2()
26 {
27 Console.WriteLine("===================>");
28 }
29 30 internalvoid Show3()
31 {
32 Console.WriteLine(this.name +"==>"+this.sex);
33 }
34 35 36 37 publicclass Student
38 {
39 publicvoid SetPer(string name, string sex)
40 {
41 Person1 p =new Person1();
42 p.name = name;
43 p.sex = sex;
44 45 p.Show3();
46 p.Show1();
47 }
48 49 }
50 }
51 }
這段程式碼同樣定義了一個外部類Person1 和一個內部類Student,內部類中的SetPer()呼叫了外部類中的方法,寫這段程式碼我們可以發現 巢狀類可以訪問外部類的方法、屬性、欄位而不受訪問修飾符的限制
4.內部類的繼承
1 namespace GameStatistical.Test.InnerClass2 {
3 publicclass Person
4 {
5 publicclass Student
6 {
7 publicstaticint age;
8 internalstaticint height;
9 privatestaticstring sex;
10 11 publicvirtualvoid Show()
12 {
13 Console.WriteLine("年齡:"+age);
14 Console.WriteLine("身高:"+height);
15 }
16 17 internalvoid Display()
18 {
19 Console.WriteLine("internal");
20 Console.WriteLine("年齡:"+ age);
21 Console.WriteLine("身高:"+ height);
22 }
23 }
24 25 26 publicvoid Show()
27 {
28 Student.age =21;
29 Student.height =75;
30 Student student =new Student();
31 student.Show();
32 student.Display();
33 }
34 }
35 }
內部類繼承,上面的內部類定義了父類,其中public virtual void Show() 使用virtual 修飾,可以用於子類重寫這個方法,看內部類繼承子類是否能夠重寫這個方法。
1 namespace GameStatistical.Test.InnerClass2 {
3 publicclass SubPerson:Person
4 {
5 publicclass SubStudent : Student
6 {
7 publicoverridevoid Show()
8 {
9 base.Show();
10 }
11 }
12 }
13 }
上面的程式碼重寫了Show() 這個方法,說明內部類的繼承可以通過
5.反射內部類
對於這段程式碼,是從其他網站看到的,反射內部類我們不能直接通過 "." 操作符直接來操作,而是通過 "+" 操作符。前面也提到過內部類也是一種有效的管理名稱空間的方法,這裡也是普通類和內部類的一點區別
反射內部類
Activator.CreateInstance("GameStatistical.Test.InnerClass", "GameStatistical.Test.InnerClass.ReflectionPerson+Student");
反射普通類
Activator.CreateInstance("GameStatistical.Test.InnerClass", "GameStatistical.Test.InnerClass.ReflectionPerson.Student");
在實際操作中,內部類好像使用的比較少,這裡也只是非常簡單的介紹,作為一個知識點總結起來。