C#中的继承和嵌套类

10

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

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中,我们是否可以获得更多的东西?


可能是为什么要使用嵌套类的原因?的重复问题。 - bzlm
4个回答

16
你提供的第二个例子并不是一个嵌套类,而是一个普通类,它派生自OuterClass
  • 嵌套类型默认为private可见性,但可以声明更广泛的可见性。
  • 嵌套类型可以访问包含类型的属性、字段和方法(即使这些成员被声明为private或从基类型中继承)。

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

编辑
针对@Henk关于两种关系本质差异的评论: 在两种情况下,你都有两个类之间的关系,但它们的性质不同。当从基类派生时,派生类继承了基类的所有方法、属性和字段(除了private)。但是对于嵌套类来说这不是真的继承,而是可以访问包含类中的所有东西 - 即使是private字段、属性和方法。


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

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

4

也许有点晚了,但是请允许我补充一些意见:

您的问题是否是:嵌套类继承其外部类的优点是什么?

关键在于构造函数

以下是第一份代码:

    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。


第一段代码中,当构建NestedClass对象时,OutrClass的构造函数也会被调用,在我看来,这意味着NestedClass和OuterClass之间存在组合关系。但在第二段代码中,NestedClass和Outerclass的对象构造并不相互绑定,而是独立进行。

希望这有所帮助。


1

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

嵌套类代表了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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接