C# 內部類


一:這里介紹C#內部類能夠使用外部類定義的類型和靜態方法,但是不能直接使用外部類的實例方法,直接看來,外部類對於內部類的作用更像是一個命名空間。

C#語言有很多值得學習的地方,這里我們主要介紹C#內部類,包括介紹instance方法和private方法等方面。

C#內部類能夠使用外部類定義的類型和靜態方法,但是不能直接使用外部類的實例方法,直接看來,外部類對於內部類的作用更像是一個命名空間,在C#中,始終可以用(只要訪問控制允許)

Sys.Model.Key key = new Model.Key();來創建一個內部類的實例,這個實例與外部類的任何實例沒有任何直接的關系。類似於Java中的靜態內部類。

在C#中,類區分為Nested Class和Not-Nested Class,前者是聲明在其他數據類型內部的類。后者是直接定義在某一個命名空間的類。

非內嵌類只允許使用public和internal的訪問控制,而內置類則允許使用所有的五種訪問控制符,private, protected , internal protected,public和internal.內部類也可以訪問外部類的所有方法,包括instance方法和private方法,但是需要顯式的傳遞一個外部類的實例。

創建內部類的一個目的是為了抽象外部類的某一狀態下的行為,或者C#內部類僅在外部類的某一特定上下文存在。或是隱藏實現,通過將內部類設為private,可以設置僅有外部類可以訪問該類。內部類的另外一個重要的用途是當外部類需要作為某個特定的類工作,而外部類已經繼承與另外一個類的時候,因為C#不支持多繼承,所以創建一個對應的內部類作為外部類的一個facecade來使用。

二:

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

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

(2)擴展了命名空間,可以將外部類的類名作為內部類的一個命名空間(這里只是相當於,但不是真正的命名空間)。

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

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

1.內部類的定義:

嵌套類:在一個類中定義另外一個類,主要分為靜態嵌套類和非靜態嵌套類(又稱之為"內部類")。內部類的定義結構:

(1)在一個類中直接定義類。

(2)在一個方法中定義類。

(3)匿名內部類。

2.外部類訪問內部類

  1. 外部類訪問內部類 例子  
  2.  namespace GameStatistical.Test.InnerClass  
  3.  {  
  4.      public class Person  
  5.      {  
  6.          public class Student  
  7.          {  
  8.              public static int age;  
  9.              internal static int height;  
  10.              private static string sex;  
  11.  
  12.              public virtual void Show()  
  13.             {  
  14.                  Console.WriteLine("年齡:"+age);  
  15.                  Console.WriteLine("身高:"+height);  
  16.              }  
  17.    
  18.              internal void Display()  
  19.             {  
  20.                  Console.WriteLine("internal");  
  21.                 Console.WriteLine("年齡:" + age);  
  22.                  Console.WriteLine("身高:" + height);  
  23.              }  
  24.          }  
  25.    
  26.    
  27.          public void Show()  
  28.          {  
  29.              Student.age = 21;  
  30.              Student.height = 75;  
  31.              Student student = new Student();  
  32.              student.Show();  
  33.          }  
  34.      }  
  35.  } 

該段代碼定義了一個外部類Person 和一個內部類Student, 其中內部類Student中使用了各種修飾符修飾的變量和方法,從上面的例子可以看出外部類只能夠訪問嵌套類中修飾符為public、internal的字段、方法、屬性。調用外部類的 Show()方法運行得到如下結果:

3.內部類訪問外部類

  1. 內部類訪問外部類 例子  
  2.  namespace GameStatistical.Test.InnerClass  
  3.  {  
  4.      public class Person1  
  5.      {  
  6.          private string name;  
  7.    
  8.          public string Name  
  9.          {  
  10.              get { return name; }  
  11.              set { name = value; }  
  12.          }  
  13.          private string sex;  
  14.    
  15.          public string Sex  
  16.          {  
  17.              get { return sex; }  
  18.              set { sex = value; }  
  19.          }  
  20.    
  21.          public void Show1()  
  22.          {  
  23.              Console.WriteLine(this.name + "==>" + this.sex);  
  24.          }  
  25.    
  26.          private static void Show2()  
  27.          {  
  28.              Console.WriteLine("===================>");  
  29.          }  
  30.    
  31.         internal void Show3()  
  32.          {  
  33.              Console.WriteLine(this.name + "==>" + this.sex);  
  34.          }  
  35.    
  36.    
  37.    
  38.          public class Student  
  39.          {  
  40.              public void SetPer(string name, string sex)  
  41.              {  
  42.                  Person1 p = new Person1();  
  43.                  p.name = name;  
  44.                  p.sex = sex;  
  45.    
  46.                  p.Show3();  
  47.                  p.Show1();  
  48.              }  
  49.    
  50.          }  
  51.      }  
  52.  } 

這段代碼同樣定義了一個外部類Person1 和一個內部類Student,內部類中的SetPer()調用了外部類中的方法,寫這段代碼我們可以發現 嵌套類可以訪問外部類的方法、屬性、字段而不受訪問修飾符的限制

4.內部類的繼承

  1. 內部類繼承例子1  
  2.  namespace GameStatistical.Test.InnerClass  
  3.  {  
  4.      public class Person  
  5.      {  
  6.          public class Student  
  7.          {  
  8.              public static int age;  
  9.              internal static int height;  
  10.              private static string sex;  
  11.    
  12.              public virtual void Show()  
  13.              {  
  14.                  Console.WriteLine("年齡:"+age);  
  15.                  Console.WriteLine("身高:"+height);  
  16.              }  
  17.    
  18.              internal void Display()  
  19.              {  
  20.                  Console.WriteLine("internal");  
  21.                  Console.WriteLine("年齡:" + age);  
  22.                  Console.WriteLine("身高:" + height);  
  23.              }  
  24.          }  
  25.    
  26.    
  27.          public void Show()  
  28.          {  
  29.              Student.age = 21;  
  30.              Student.height = 75;  
  31.              Student student = new Student();  
  32.              student.Show();  
  33.              student.Display();  
  34.          }  
  35.      }  
  36.  } 

內部類繼承,上面的內部類定義了父類,其中public virtual void Show() 使用virtual 修飾,可以用於子類重寫這個方法,看內部類繼承子類是否能夠重寫這個方法。

  1. 內部類繼承例子2  
  2.  namespace GameStatistical.Test.InnerClass  
  3.  {  
  4.      public class SubPerson:Person  
  5.      {  
  6.          public class SubStudent : Student  
  7.          {  
  8.              public override void Show()  
  9.              {  
  10.                  base.Show();  
  11.              }  
  12.          }  
  13.      }  
  14.  } 

上面的代碼重寫了Show() 這個方法,說明內部類的繼承可以通過

5.反射內部類

對於這段代碼,是從其他網站看到的,反射內部類我們不能直接通過 "." 操作符直接來操作,而是通過 "+" 操作符。前面也提到過內部類也是一種有效的管理命名空間的方法,這里也是普通類和內部類的一點區別:

反射內部類

  1. Activator.CreateInstance("GameStatistical.Test.InnerClass", "GameStatistical.Test.InnerClass.ReflectionPerson+Student");
  2.   

反射普通類

  1. Activator.CreateInstance("GameStatistical.Test.InnerClass", "GameStatistical.Test.InnerClass.ReflectionPerson.Student");
  2.   

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM