简化情况
public class A {
protected A() { }
protected A Make() { return new A(); }
}
public class B : A {
A a = new A(); //inaccessible due to protection level
B b = new B();
private B()
{
A c = new A();//inaccessible due to protection level
a = new A(); //inaccessible due to protection level
a = Make();
}
}
为什么不能使用 A 类保护的构造函数在 B 类中创建 A 的实例?
在我看来, protected 构造函数就像 protected 方法,因此应该可以在子类中运行它。
最佳答案
Why it's impossible to create instance of A in class B using class A protected constructor?
您不能使用new
修饰符调用 protected 构造函数,因为 protected 构造函数的目的是它只能被调用从派生类的角度来看,因此从“外部”看不到。
编译器不会推断对 new A()
的调用是从 B
的实例完成的。这就是构造函数语法可用的原因,以保证如何调用基本构造函数的约定。
在为 B
声明构造函数时,您可以调用 A
构造函数:
public B(string foo) : base(foo)
这实际上是代表您为默认构造函数所做的。例如:
public class A {}
public class B : A
{
public B() {}
}
将产生以下 IL:
// Methods
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x205a
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void A::.ctor() <--- This.
IL_0006: ret
} // end of method B::.ctor
一种 hackish 方法(我会避免这样做)是创建这样一个实例,可以通过 Activator.CreateInstance
重载来实现,它接受一个 bool
标志,指示构造函数是非公开:
var b = (B)Activator.CreateInstance(typeof(B), nonPublic: true);
关于c# - 使用父保护构造函数实例化子类字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33363938/