C#中的内部类

最近在看java一方面的书籍,看到一个很奇怪的问题,java类中还可以再定义一个类,这种结构非常特殊!后来才发现我知识浅薄了,原来C#中也有内部类,之前都一直没有注意过这个语法结构!

使用内部类有这样几个好处:

(1)抽象外部类的某一状态下的行为,隐藏实现,通过修改该内的访问修饰符,可以设置仅有外部类可以访问该类

(2)扩展了命名空间,可以将外部类的类名作为内部类的一个命名空间(这里只是相当于,但不是真正的命名空间)

(3)内部类可以当作外部类的一个扩展,可以活的更好的封装。

上面的这些特点胡乱的总结了一下,可能有些词不达意,下面有些具体例子:

1.内部类的定义:

嵌套类:在一个类中定义另外一个类,主要分为静态嵌套类和非静态嵌套类(又称之为"内部类")

内部类的定义结构:(1)在一个类中直接定义类(2)在一个方法中定义类(3)匿名内部类

2.外部类访问内部类

外部类访问内部类 例子

该段代码定义了一个外部类Person 和一个内部类Student, 其中内部类Student中使用了各种修饰符修饰的变量和方法,从上面的例子可以看出外部类只能够访问嵌套类中修饰符为public、internal的字段、方法、属性。

调用外部类的 Show()方法运行得到如下结果:

3.内部类访问外部类

1 namespace GameStatistical.Test.InnerClass
 2 {
 3     public class Person1
 4     {
 5         private string name;
 6 
 7         public string Name
 8         {
 9             get { return name; }
10             set { name = value; }
11         }
12         private string sex;
13 
14         public string Sex
15         {
16             get { return sex; }
17             set { sex = value; }
18         }
19 
20         public void Show1()
21         {
22             Console.WriteLine(this.name + "==>" + this.sex);
23         }
24 
25         private static void Show2()
26         {
27             Console.WriteLine("===================>");
28         }
29 
30         internal void Show3()
31         {
32             Console.WriteLine(this.name + "==>" + this.sex);
33         }
34 
35 
36 
37         public class Student
38         {
39             public void 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     public class Person
 4     {
 5         public class Student
 6         {
 7             public static int age;
 8             internal static int height;
 9             private static string sex;
10 
11             public virtual void Show()
12             {
13                 Console.WriteLine("年龄:"+age);
14                 Console.WriteLine("身高:"+height);
15             }
16 
17             internal void Display()
18             {
19                 Console.WriteLine("internal");
20                 Console.WriteLine("年龄:" + age);
21                 Console.WriteLine("身高:" + height);
22             }
23         }
24 
25 
26         public void 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     public class SubPerson:Person
 4     {
 5         public class SubStudent : Student
 6         {
 7             public override void 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");

在实际操作中,内部类好像使用的比较少,这里也只是非常简单的介绍,作为一个知识点总结起来。

好文要顶 关注我 收藏该文  

时间: 2024-09-30 20:55:24

C#中的内部类的相关文章

Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

Java中的内部类(成员内部类.静态内部类.局部内部类.匿名内部类) 神话丿小王子的博客主页 我们先看这样一段话:人是由大脑.肢体.器官等身体结果组成.而组成我们人体的心脏它也有自己的属性和行为(血液.跳动),显然,此处不能单方面用属性或者方法表示一个心脏了,而需要一个类,但是这个类要依赖于人这个类存在(因为心脏不能脱离人体而存活,当然不考虑现今社会的发达科技,只从正常情况下来说),所心脏以需要写在人类的内部.内部类就相当于其中的某个器官之一. 首先看看什么是内部类:在类的内部定义另一个类.没错

【转 Java 中的内部类和匿名类

 Java 中的内部类和匿名类 2008-10-16 13:47:41 标签:Java 内部类 匿名类 休闲 职场 Java 中的内部类和匿名类* 为什么需要内部类? Java 内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口.由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能. 不过你可能要质疑,更改一

【java基础】内部类,局部内部类,匿名内部类、静态内部类、接口中的内部类

内部类: 1.定义在一个类中的内部类,内部类的实例化伴随着外围类所定义的方法来构造,内部类对象有外围类的隐式引用,所以内部类可以直接访问外围类的外围类的域,包括私有的,这是内部类的访问特权,所以比常规类功能更加强大. 2.内部类可以对同一个包中的其他类隐藏起来,不过可以通过 OuterClass.InnerClass来引用public声明的内部类. 局部内部类: 1.内部类挪到方法内部,与内部类相比,局部内部类不仅可以访问定义他们的外部类,还可以并且仅可以访问声明为final的局部变量. 2.类

定义在方法中的内部类能否访问该方法的局部变量?

定义在方法中的内部类当然是可以访问方法中的局部变量的,访问的方法就是在局部变量上添加final关键字 (1)内部类是外部类的一个成员,就像外部类的成员方法一样,所以内部类有权限访问外部类的所有成员,包括private的.(2)内部类不能访问外部类方法中的局部变量,除非变量是final的(一般发生在方法中定义的内部类).这是因为局部变量的生命周期原因. class Outer{    private int a;    public class Inner{        private int

java中的内部类和匿名内部类的使用

部分内容参考http://www.imooc.com/ 内部类: 什么是 Java 中的内部类 问:什么是内部类呢? 答:内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. 问:那为什么要将一个类定义在另一个类里面呢?清清爽爽的独立的一个类多好啊!! 答:内部类的主要作用如下: 1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类 2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据 3. 内

方法中的内部类能不能访问方法中的局部变量

1).内部类是外部类的一个成员,就像外部类的成员方法一样,所以内部类有权限访问外部类的所有成员,包括private的.(2).内部类不能访问外部类方法中的局部变量,除非变量是final的(一般发生在方法中定义的内部类).这是因为局部变量的生命周期原因. class Outer{    private int a;    public class Inner{        private int a;        public void method(int a){            a+

接口中的内部类

在接口中实现内部类可以使该接口的所有实现所共用. public interface BaseInter { public void f1(); public void f2(); class BaseImp implements BaseInter{ @Override public void f1() { System.out.println("Base.f1()"); } @Override public void f2() { System.out.println("B

java语言中的内部类和匿名内部类

内部类 将一个类定义在另一个类的里面,对里面那个类就称为内部类. 访问特点: 1,内部类可以直接访问外部类中的成员,包括私有成员 2,外部类需要访问内部类中的成员必须要建立内部类的对象. 一般用于类的设计. 分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容. 这时就把还有的食物定义成内部类来描述. 直接访问外部类中的内部类中的成员 class Outer { class Inner { } } class Innerclassdemo { public static v

【转】Java中的内部类和匿名类

Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦.学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地设计你的程序结构.下面从以下几个方面来介绍: 第一次见面 public interface Contents {    int value();} public interfac

Java中的 内部类(吐血总结)

1.内部类分类 1)普通内部类 类的实例相关,可以看成是一个实例变量.内部类的类名由 "外部类.内部类" 确定. 普通内部类不能声明 static相关的变量或方法.内部类可以直接访问外部类的所有成员(包括 private成员),隐式或显式(外部类.this).而外部类可以 new 内部类,实例相关的可以直接 new,static 相关(类相关)需要使用实例的引用去 引用.new.内部类 class 前可以添加 private 与 protected 表示只对其外部类或其子类有访问权限.