在任何上下文中从派生类访问继承的受保护构造函数都会引发数据封装问题。
从历史上看,C# 从第一个版本开始就允许这种访问。但它在 VS 2005 中得到了修复。派生类现在只能从它们自己的构造函数中调用它们的基本受保护构造函数。
class Base
{
protected Base()
{
}
}
class Derived : Base
{
public Derived() : base() // Still allowed in VS 2005
{
}
public void Main()
{
Base b = new Base(); // Allowed in VS 2003, but error in VS 2005
}
}
在 VB.NET 中,您可以通过两种方式初始化变量。首先是赋值运算符,然后是声明;第二个是“As New”声明。
在受保护的构造函数的情况下,“As New”总是可以正常工作。至于通过赋值进行初始化,它会引发编译错误。但是如果你在基类中有多个构造函数,赋值初始化也会起作用!
Class Base
Protected Sub New()
End Sub
End Class
Class Derived
Inherits Base
Public Sub Main()
Dim foo As New Base // Allowed
Dim moo As Base = New Base() // Error if Base has only one constructor
End Sub
End Class
VB.NET 允许这种访问的原因可能是与遗留代码的兼容性。
更多详情:http: //blogs.msdn.com/b/peterhal/archive/2005/06/29/434070.aspx