c#中的继承+嵌套类

本文关键字:嵌套 继承 | 更新日期: 2023-09-27 18:09:30

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
}

我想知道,这两种情况有什么不同?什么是在情形一中可以实现而在情形二中不能实现的?有什么我们得到更多的通过使NestedClass"嵌套"到outerclasses ?

c#中的继承+嵌套类

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

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

还可以看看这个问题,什么时候以及为什么使用嵌套类。
嵌套类型(c#编程指南)

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

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

也许太晚了,但请让我补充一下我的意见,如果我能正确理解你的问题,你的意思是:

继承外部类的嵌套类的优点是什么?

关键在施工

首码:

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

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 called


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

希望对大家有所帮助。

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

就单例设计模式实现而言,嵌套类表示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。