C#中的inheritance+ NestedClasses

我们可以在C#中使用嵌套类。 这些嵌套类也可以inheritanceOuterClass。 例如:

public class OuterClass { // code here public class NestedClass : OuterClass { // code here } } 

完全可以接受。

我们也可以在不将NestedClass作为OuterClass的嵌套类的情况下实现这一点,如下所示:

 public class OuterClass { // code here } public class NestedClass : OuterClass { // code here } 

我想知道,上面两个场景之间有什么区别? 在方案I中可以实现的是在方案II中无法实现的? 通过使NestedClass“嵌套”到OuterClasss,我们能得到更多的东西吗?

您提供的第二个示例不是嵌套类,而是从OuterClass派生的普通类。

  • 嵌套类型默认为private可见性,但可以使用更广泛的可见性声明
  • 嵌套类型可以访问包含类型的属性,字段和方法(甚至是那些声明为private和从基类inheritance的那些)

还可以在这里看一下这个问题,了解何时以及为何使用嵌套类。
MSDN链接: 嵌套类型(C#编程指南)

编辑
要解决@Henk关于两种关系(inheritance与嵌套类型)性质差异的评论:在这两种情况下,你都有两种类之间的关系,但它们具有不同的性质。 从派生类派生时,派生类inheritance基类的所有( private除外)方法,属性和字段。 嵌套类不适用。 嵌套类不inheritance任何东西,但可以访问包含类中的所有内容 – 甚至是private字段,属性和方法。

从父类inheritance不允许嵌套类查看其父级的私有成员和方法,只能看到受保护的(和公共的)成员和方法。 将它嵌套在父类中可以让它看到所有私有成员并调用其私有方法,无论嵌套类是否inheritance父类。

它可能为时已晚但让我加2美分请 ,如果我能正确理解你的问题,你的意思是:

嵌套类也从其外部类inheritance的优点是什么?

关键在于建设

第一个代码:

  public class OuterClass { public OuterClass{console.writeln("OuterClaass Called");} public class NestedClass : OuterClass //It does Inherit { public NestedClass{console.writeln("NestedClass Called");} } } static void Main() { outerClass.NestedClass nestedobject = new outerClass.NestedClass(); } 

OutPut:

外层叫

NestedClass被调用

第二代码:

 public class OuterClass { public OuterClass{console.writeln("OuterClaass Called");} public class NestedClass //it dosent Inherit { public NestedClass{console.writeln("NestedClass Called");} } } static void Main() { OuterClass.NestedClass nestedobject = new OuterClass.NestedClass(); } 

输出:

NestedClass调用


在构造NestedClass对象的第一个代码中 ,OutrClass的构造函数也将被调用。在我看来,它意味着NestedClass和OuterClass之间的组合关系但是在NestedClass和Outerclass的第二个代码对象构造中没有绑定在一起它独立完成。

希望它会有所帮助。

嵌套类与子类的不同之处在于它们在inheritance容器类时可以访问容器类的属性和私有字段。

嵌套类表示inheritance与OOP中的封装的组合,就单例设计模式实现而言,其中依赖性被很好地隐藏,并且一个类提供对内部类的静态访问的单点访问,同时保持实例化能力。

例如,使用实用类连接数据库并插入数据:

 public class WebDemoContext { private SqlConnection Conn; private string connStr = ConfigurationManager.ConnectionStrings["WebAppDemoConnString"].ConnectionString; protected void connect() { Conn = new SqlConnection(connStr); } public class WebAppDemo_ORM : WebDemoContext { public int UserID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Phone { get; set; } public string Email { get; set; } public string UserName { get; set; } public string UserPassword { get; set; } public int result = 0; public void RegisterUser() { connect(); SqlCommand cmd = new SqlCommand("dbo.RegisterUser", Conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("FirstName", FirstName); cmd.Parameters.AddWithValue("LastName", LastName); cmd.Parameters.AddWithValue("Phone", Phone); cmd.Parameters.AddWithValue("Email", Email); cmd.Parameters.AddWithValue("UserName", UserName); cmd.Parameters.AddWithValue("UserPassword", UserPassword); try { Conn.Open(); result = cmd.ExecuteNonQuery(); } catch (SqlException se) { DBErrorLog.DbServLog(se, se.ToString()); } finally { Conn.Close(); } } } } 

WebAppDemo_ORM类是WebAppDemo_ORM中的嵌套类,同时从WebDemoContextinheritance,嵌套类可以访问容器类的所有成员,包括可以有效减少DRY和实现SOC的私有成员。