【问题标题】:Inheritance + NestedClasses in C#C#中的继承+嵌套类
【发布时间】:2011-11-24 14:01:46
【问题描述】:

我们可以在 C# 中拥有嵌套类。这些嵌套类也可以继承 OuterClass。例如:

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,我们能得到更多的东西吗?

【问题讨论】:

标签: c# inheritance nested-class


【解决方案1】:

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

  • 嵌套类型默认为 private 可见性,但可以声明为具有更广泛的可见性
  • 嵌套类型可以访问包含类型的属性、字段和方法(即使是声明为private 和从基类型继承的那些)

还可以查看question here,了解何时以及为何使用嵌套类。
MSDN 链接:Nested Types (C# Programming Guide)

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

【讨论】:

  • 它不是“自己的普通类”,而是派生类。与 OuterClass 有关系,只是完全不同的关系。
  • @HenkHolterman 谢谢。我改进了措辞以更好地解决这个问题
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    同样从外部类继承的嵌套类有什么好处?

    关键在于建设

    第一个密码:

        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();
    }
    

    输出:

    外部类调用

    调用嵌套类

    第二个密码:

    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对象的第一段代码中,OutrClass的构造函数也会被调用,我认为这意味着NestedClass和OuterClass之间的组成关系但是在Second Code中NestedClass和Outerclass的对象构造不是绑定在一起的,而是独立完成的。

    希望对您有所帮助。

    【讨论】:

      【解决方案4】:

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

      嵌套类代表了 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 类是WebDemoContext 内部的嵌套类,同时继承自WebDemoContext,这样嵌套类可以访问容器类的所有成员,包括私有成员,这可以有效减少DRY 并实现SOC。

      【讨论】:

        猜你喜欢
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多