Ответ 1
Вы должны вызвать конструктор базового класса до тела конструктора производного класса.
class Derived : Base
{
public Derived(string someParams)
: base("Blah " + someParams)
{
}
}
У меня есть следующая иерархия:
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);
}
}
Вы должны вызвать конструктор базового класса до тела конструктора производного класса.
class Derived : Base
{
public Derived(string someParams)
: base("Blah " + someParams)
{
}
}
Вы не можете. Вы можете вызвать его раньше:
public Derived() : base()
или вы должны использовать hook
class Base
{
protected void init() { }
public Base(string sMessage)
{
init();
}
}
class Derived : Base
{
public Derived(string someParams)
{
string sMessage = "Blah " + someParams;
init();
}
}
Я изначально пропустил комментарий 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;
}
}
Если вам действительно нужно, чтобы ваш конструктор работал первым, я предлагаю использовать защищенный метод 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();
}
}
Точки, которые нужно отметить в конструкторах:
Конструкторы не могут быть "виртуальными".
. Они не могут быть унаследованы.
. Конструкторы вызываются в порядке наследования.
public Child(string a):base(a){}
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();
}
}
На самом деле простейшим решением является:
class Base
{
public Base(string sMessage)
{
//Do stuff
}
}
class Derived : Base
{
public Derived(string someParams)
: base("Blah " + someParams)
{
}
}
Почему сложнее?