如何在之后调用基类'构造函数我调用了自己的构造函数?
问题是,基类'构造函数调用一个抽象方法(在子类中重写),需要访问变量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();
创建后的SubClass
对象上调用this.DoStuff();
?当然我可以在子类'构造函数中的所有其他行之后添加{{1}},但是这些类中有大约100个,它感觉很愚蠢。任何其他解决方案,还是我应该使用手册?
答案 0 :(得分:25)
你不能。
此外,您通常不应在构造函数中调用virtual
方法。请参阅此answer。
根据您的实际代码而不是您编写的简单示例,您可以将值作为基础构造函数和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()
即可完成任务。还记得密封你的SubClass
课程,这样其他人就无法通过另一次修改DoStuff
方法来引入错误。
答案 1 :(得分:4)
我不会在构造函数中调用抽象方法,因为调用该方法的实例的构造函数没有执行
调用虚方法时,直到运行时才会选择执行该方法的实际类型。当构造函数调用虚方法时,可能没有执行调用该方法的实例的构造函数。 要修复违反此规则的行为,请不要在类型的构造函数中调用类型的虚方法。
http://msdn.microsoft.com/en-us/library/ms182331%28v=vs.80%29.aspx
答案 2 :(得分:0)
有没有理由在构造函数实际运行之前无法构造类?它需要更高级别的责任来创建派生类,并且可能不是最佳实践,但它似乎有效。
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;
}
}
答案 3 :(得分:0)
您不能那样做。但是您可以将主类的启动代码放入单独的initialize方法中。然后,您可以>在构造函数代码之后在特定的构造函数中调用该方法。