我有以下层次结构:
class Base
{
public Base(string sMessage)
{
//Do stuff
}
}
class Derived : Base
{
public Derived(string someParams)
{
string sMessage = "Blah " + someParams;
//Here I want to call the base constructor
//base(sMessage);
}
}
答案 0 :(得分:19)
您必须在派生类构造函数的主体之前调用基类构造函数。
class Derived : Base
{
public Derived(string someParams)
: base("Blah " + someParams)
{
}
}
答案 1 :(得分:8)
你做不到。您可以在之前调用它:
public Derived() : base()
或者你必须使用钩子
class Base
{
protected void init() { }
public Base(string sMessage)
{
init();
}
}
class Derived : Base
{
public Derived(string someParams)
{
string sMessage = "Blah " + someParams;
init();
}
}
答案 2 :(得分:7)
我最初错过了OregonGhost关于使用静态方法修改参数的评论,这对我来说最有用,所以我想我会为其他读过这个帖子的人添加一个代码示例:
class Base
{
public Base( string sMessage )
{
// Do stuff
}
}
class Derived : Base
{
public Derived( string sMessage ) : base( AdjustParams( sMessage ) )
{
}
static string AdjustParams( string sMessage )
{
return "Blah " + sMessage;
}
}
答案 3 :(得分:4)
如果你真的需要先运行你的构造函数,那么我建议你使用一个受构造函数调用的受保护的Initialize方法,并完成初始化类的实际工作。您需要提供一个允许跳过初始化的备用构造函数。
public class Base
{
public Base() : this(true) { }
protected Base(bool runInitializer)
{
if (runInitializer)
{
this.Initialize();
}
}
protected void Initialize()
{
...initialize...
}
}
public class Derived : Base
{
// explicitly referencing the base constructor keeps
// the default one from being invoked.
public Derived() : base(false)
{
...derived code
this.Initialize();
}
}
答案 4 :(得分:1)
关于构造函数的注意事项:
·构造函数不能是“虚拟”。
·它们不能被继承。
·构造函数按继承顺序调用。
public Child(string a):base(a){}
答案 5 :(得分:0)
public Derived(string someParams) : base(someParams)
{
string sMessage = "Blah " + someParams;
}
这是你必须这样做的方式。您可以将之后要调用的代码放在基类中的受保护方法中,然后您可以像这样调用它:
class Base
{
public Base(string sMessage)
{
ConstructorStuff();
}
protected Base()
{
}
protected void ConstructorStuff()
{
}
}
class Derived : Base
{
public Derived(string someParams)
{
string sMessage = "Blah " + someParams;
ConstructorStuff();
}
}
答案 6 :(得分:0)
实际上,最简单的解决方案是:
class Base
{
public Base(string sMessage)
{
//Do stuff
}
}
class Derived : Base
{
public Derived(string someParams)
: base("Blah " + someParams)
{
}
}
为什么要把它变得更复杂?