Вызов базового конструктора в С#

У меня есть следующая иерархия:

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);

  }

}

Ответы

Ответ 1

Вы должны вызвать конструктор базового класса до тела конструктора производного класса.

class Derived : Base
{
  public Derived(string someParams)
    : base("Blah " + someParams)
  {

  }

}

Ответ 2

Вы не можете. Вы можете вызвать его раньше:

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();
  }
}

Ответ 3

Я изначально пропустил комментарий 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;
    }
}

Ответ 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();
    }
}

Ответ 5

Точки, которые нужно отметить в конструкторах:

Конструкторы не могут быть "виртуальными".

. Они не могут быть унаследованы.

. Конструкторы вызываются в порядке наследования.

public Child(string a):base(a){}

Ответ 6

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();       
  }    
}

Ответ 7

На самом деле простейшим решением является:

class Base
{
  public Base(string sMessage)
  {
     //Do stuff
  }
}

class Derived : Base
{
  public Derived(string someParams)
    : base("Blah " + someParams)
  {
  }

}

Почему сложнее?