18 c# inheritance constructor class superclass
在调用自己的构造函数后,如何调用基类的构造函数?
问题是,基类的构造函数调用一个抽象方法(在子类中重写),它需要访问变量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;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:根据答案,显然是不可能的.有没有一种自动方式来调用它们创建后的this.DoStuff();每个对象SubClass?当然我可以this.DoStuff();在子类的构造函数中添加所有其他行之后添加,但是这些类中有大约100个,感觉很愚蠢.任何其他解决方案,还是我应该使用手册?
ken*_*n2k 26
你不能.
此外,您通常不应该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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你的实际代码不可能,那么写多个DoStuff()就能胜任.还记得要密封你的SubClass课程,这样其他人就无法通过DoStuff另一次修改方法来引入bug .
我不会在构造函数中调用抽象方法,因为调用该方法的实例的构造函数可能没有执行
当调用虚拟方法时,直到运行时才会选择执行该方法的实际类型。当构造函数调用虚方法时,调用该方法的实例的构造函数可能尚未执行。要修复违反此规则的情况,请不要从类型的构造函数中调用类型的虚拟方法。
http://msdn.microsoft.com/en-us/library/ms182331%28v=vs.80%29.aspx
| 归档时间: |
|
| 查看次数: |
33813 次 |
| 最近记录: |