在C#中调用基础构造函数

时间:2009-03-09 15:42:09

标签: c# asp.net

我有以下层次结构:

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

  }

}

7 个答案:

答案 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)
  {
  }

}

为什么要把它变得更复杂?