1. 程式人生 > >c# 中內部類的簡單介紹

c# 中內部類的簡單介紹

最近在看java一方面的書籍,看到一個很奇怪的問題,java類中還可以再定義一個類,這種結構非常特殊!後來才發現我知識淺薄了,原來C#中也有內部類,之前都一直沒有注意過這個語法結構!

使用內部類有這樣幾個好處: 

(1)抽象外部類的某一狀態下的行為,隱藏實現,通過修改該內的訪問修飾符,可以設定僅有外部類可以訪問該類

(2)擴充套件了名稱空間,可以將外部類的類名作為內部類的一個名稱空間(這裡只是相當於,但不是真正的名稱空間)

(3)內部類可以當作外部類的一個擴充套件,可以活的更好的封裝。

 上面的這些特點胡亂的總結了一下,可能有些詞不達意,下面有些具體例子:

1.內部類的定義:

巢狀類:在一個類中定義另外一個類,主要分為靜態巢狀類和非靜態巢狀類(又稱之為"內部類") 

內部類的定義結構:(1)在一個類中直接定義類(2)在一個方法中定義類(3)匿名內部類

2.外部類訪問內部類

複製程式碼  1 namespace GameStatistical.Test.InnerClass
 2 {
 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 } 複製程式碼

該段程式碼定義了一個外部類Person 和一個內部類Student, 其中內部類Student中使用了各種修飾符修飾的變數和方法,從上面的例子可以看出外部類只能夠訪問巢狀類中修飾符為public、internal的欄位、方法、屬性。

呼叫外部類的 Show()方法執行得到如下結果:

 

3.內部類訪問外部類

複製程式碼  1 namespace GameStatistical.Test.InnerClass
 2 {
 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.InnerClass
 2 {
 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.InnerClass
 2 {
 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"); 

在實際操作中,內部類好像使用的比較少,這裡也只是非常簡單的介紹,作為一個知識點總結起來。