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 ?
您提供的第二个示例是不是一个嵌套类,而是一个派生自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。