c# - 使用父保护构造函数实例化子类字段

标签 c# inheritance constructor field protected

简化情况

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/

相关文章:

c# - 如何使用 C# 将文本框值更新为绑定(bind)源?

c# - 如何使用 C# 下载具有正确编码的 HTML 页面?

c# - 如何反序列化自定义对象列表

java - 在Java中,当一个接口(interface) "extends"另一个接口(interface)时到底会发生什么?

C++:初始化成员 Vector 值

c# - 如何使用 LINQ 选择一个对象?

PHP:如何从父类调用子类的函数

java - UML 类图中的接口(interface)、继承和泛型

java - 为什么 Java 构造函数必须是 public 或 protected 才能将类扩展到其包之​​外?

c++ - 具有另一个类对象属性的类的构造函数