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;
}
}
你不能那样做。但是您可以将主类的初始化代码放入单独的初始化方法中。然后,您可以在构造函数代码之后在特定的构造函数中调用该方法。事实上,我认为您不能,至少不能以标准方式调用(使用反射也许可以,但我认为这不是一种好方法)。想想看,你的类依赖于它的父类。如何在不先创建父类的情况下创建类的实例?请参见我的编辑。我想我会在每个子类的构造函数中手动添加一行,这没什么大不了的。仍然值得一问:——)