解讀C#中內(nèi)部類(lèi)的語(yǔ)法結(jié)構(gòu)
最近在看Java一方面的書(shū)籍,看到一個(gè)很奇怪的問(wèn)題,Java類(lèi)中還可以再定義一個(gè)類(lèi),這種結(jié)構(gòu)非常特殊!后來(lái)才發(fā)現(xiàn),原來(lái)C#中也有內(nèi)部類(lèi),之前都一直沒(méi)有注意過(guò)這個(gè)語(yǔ)法結(jié)構(gòu)!
51CTO推薦閱讀:C#內(nèi)部類(lèi)簡(jiǎn)單分析
使用內(nèi)部類(lèi)有這樣幾個(gè)好處:
(1)抽象外部類(lèi)的某一狀態(tài)下的行為,隱藏實(shí)現(xiàn),通過(guò)修改該內(nèi)的訪問(wèn)修飾符,可以設(shè)置僅有外部類(lèi)可以訪問(wèn)該類(lèi)。
(2)擴(kuò)展了命名空間,可以將外部類(lèi)的類(lèi)名作為內(nèi)部類(lèi)的一個(gè)命名空間(這里只是相當(dāng)于,但不是真正的命名空間)。
(3)內(nèi)部類(lèi)可以當(dāng)作外部類(lèi)的一個(gè)擴(kuò)展,可以活的更好的封裝。
上面的這些特點(diǎn)胡亂的總結(jié)了一下,可能有些詞不達(dá)意,下面有些具體例子:
1.內(nèi)部類(lèi)的定義:
嵌套類(lèi):在一個(gè)類(lèi)中定義另外一個(gè)類(lèi),主要分為靜態(tài)嵌套類(lèi)和非靜態(tài)嵌套類(lèi)(又稱(chēng)之為"內(nèi)部類(lèi)")。內(nèi)部類(lèi)的定義結(jié)構(gòu):
(1)在一個(gè)類(lèi)中直接定義類(lèi)。
(2)在一個(gè)方法中定義類(lèi)。
(3)匿名內(nèi)部類(lèi)。
2.外部類(lèi)訪問(wèn)內(nèi)部類(lèi)
- 外部類(lèi)訪問(wèn)內(nèi)部類(lèi) 例子
- 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();
- }
- }
- }
該段代碼定義了一個(gè)外部類(lèi)Person 和一個(gè)內(nèi)部類(lèi)Student, 其中內(nèi)部類(lèi)Student中使用了各種修飾符修飾的變量和方法,從上面的例子可以看出外部類(lèi)只能夠訪問(wèn)嵌套類(lèi)中修飾符為public、internal的字段、方法、屬性。調(diào)用外部類(lèi)的 Show()方法運(yùn)行得到如下結(jié)果:
#p#
3.內(nèi)部類(lèi)訪問(wèn)外部類(lèi)
- 內(nèi)部類(lèi)訪問(wèn)外部類(lèi) 例子
- 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();
- }
- }
- }
- }
這段代碼同樣定義了一個(gè)外部類(lèi)Person1 和一個(gè)內(nèi)部類(lèi)Student,內(nèi)部類(lèi)中的SetPer()調(diào)用了外部類(lèi)中的方法,寫(xiě)這段代碼我們可以發(fā)現(xiàn) 嵌套類(lèi)可以訪問(wèn)外部類(lèi)的方法、屬性、字段而不受訪問(wèn)修飾符的限制
4.內(nèi)部類(lèi)的繼承
- 內(nèi)部類(lèi)繼承例子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();
- }
- }
- }
內(nèi)部類(lèi)繼承,上面的內(nèi)部類(lèi)定義了父類(lèi),其中public virtual void Show() 使用virtual 修飾,可以用于子類(lèi)重寫(xiě)這個(gè)方法,看內(nèi)部類(lèi)繼承子類(lèi)是否能夠重寫(xiě)這個(gè)方法。
- 內(nèi)部類(lèi)繼承例子2
- namespace GameStatistical.Test.InnerClass
- {
- public class SubPerson:Person
- {
- public class SubStudent : Student
- {
- public override void Show()
- {
- base.Show();
- }
- }
- }
- }
上面的代碼重寫(xiě)了Show() 這個(gè)方法,說(shuō)明內(nèi)部類(lèi)的繼承可以通過(guò)
5.反射內(nèi)部類(lèi)
對(duì)于這段代碼,是從其他網(wǎng)站看到的,反射內(nèi)部類(lèi)我們不能直接通過(guò) "." 操作符直接來(lái)操作,而是通過(guò) "+" 操作符。前面也提到過(guò)內(nèi)部類(lèi)也是一種有效的管理命名空間的方法,這里也是普通類(lèi)和內(nèi)部類(lèi)的一點(diǎn)區(qū)別:
反射內(nèi)部類(lèi)
- Activator.CreateInstance("GameStatistical.Test.InnerClass", "GameStatistical.Test.InnerClass.ReflectionPerson+Student");
反射普通類(lèi)
- Activator.CreateInstance("GameStatistical.Test.InnerClass", "GameStatistical.Test.InnerClass.ReflectionPerson.Student");
在實(shí)際操作中,內(nèi)部類(lèi)好像使用的比較少,這里也只是非常簡(jiǎn)單的介紹,作為一個(gè)知識(shí)點(diǎn)總結(jié)起來(lái)。
【編輯推薦】