C#调用基类';一个接一个的构造函数?

C#调用基类';一个接一个的构造函数?,c#,class,inheritance,constructor,superclass,C#,Class,Inheritance,Constructor,Superclass,在调用了自己的构造函数之后,如何调用基类的构造函数 问题是,基类的构造函数调用一个抽象方法(在子类中重写),该方法需要访问在子类的构造函数中初始化的变量x 简短示例代码: abstract class BaseClass { protected string my_string; protected abstract void DoStuff(); public BaseClass() { this.DoStuff(); } } cl

在调用了自己的构造函数之后,如何调用基类的构造函数

问题是,基类的构造函数调用一个抽象方法(在子类中重写),该方法需要访问在子类的构造函数中初始化的变量
x

简短示例代码:

abstract class BaseClass
{
    protected string my_string;

    protected abstract void DoStuff();

    public BaseClass()
    {
        this.DoStuff();
    }
}

class SubClass : BaseClass
{
    private TextBox tb;

    public SubClass()
        : base()
    {
        this.my_string = "Short sentence.";
    }

    protected override void DoStuff()
    {
        // This gets called from base class' constructor
        // before sub class' constructor inits my_string
        tb.Text = this.my_string;
    }
}

编辑:根据答案,这显然是不可能的。有没有一种自动调用this.DoStuff()的方法子类的每个对象后,是否对其执行code>?当然,我可以添加
this.DoStuff()在子类构造函数中的所有其他行之后,但是有大约100个这样的类,这感觉很愚蠢。任何其他解决方案,或者我应该使用手动解决方案吗?

我不会在构造函数中调用抽象方法,因为调用该方法的实例的构造函数可能没有执行

调用虚拟方法时,直到运行时才选择执行该方法的实际类型。当构造函数调用虚拟方法时,调用该方法的实例的构造函数可能尚未执行。 若要修复违反此规则的情况,请不要从类型的构造函数中调用类型的虚拟方法

你不能

另外,通常不应该在构造函数中调用
virtual
方法。看这个


根据实际代码而不是编写的简单示例,可以将值作为基本构造函数和
DoStuff
方法的参数传递。例如:

abstract class BaseClass
{
    private string my_string;

    protected abstract void DoStuff(string myString);

    public BaseClass(string myString)
    {
        this.my_string = myString;
        this.DoStuff(this.my_string);
    }
}

class SubClass : BaseClass
{
    private TextBox tb;

    public SubClass()
        : base("Short sentence.")
    {
    }

    protected override void DoStuff(string myString)
    {
        tb.Text = myString;
    }
}

如果您的实际代码不可能这样做,那么编写多个
DoStuff()
就可以了。还记得密封你的
子类
类,这样其他人就不能在下次修改
DoStuff
方法时引入bug了。

有什么原因不能在类的构造函数实际运行之前构造类吗?它需要对如何创建派生类承担更高级别的责任,这可能不是一种最佳实践,但它似乎是可行的

abstract class BaseClass {
    protected string my_string;

    protected abstract void DoStuff();

    public BaseClass() {
        this.DoStuff();
    }
}

class SubClass: BaseClass {
    TextBox tb;

    bool Constructed = false;
    void Constructor() {
        if (!Constructed) {
            Constructed = true;
            this.my_string = "Short sentence.";
        }
    }
    public SubClass()
        : base() {
        Constructor();
    }

    protected override void DoStuff() {
        Constructor();
        // This gets called from base class' constructor
        // before sub class' constructor inits my_string
        tb.Text = this.my_string;
    }
}

你不能那样做。但是您可以将主类的初始化代码放入单独的初始化方法中。然后,您可以在构造函数代码之后在特定的构造函数中调用该方法。

事实上,我认为您不能,至少不能以标准方式调用(使用反射也许可以,但我认为这不是一种好方法)。想想看,你的类依赖于它的父类。如何在不先创建父类的情况下创建类的实例?请参见我的编辑。我想我会在每个子类的构造函数中手动添加一行,这没什么大不了的。仍然值得一问:——)