关于asp.net:在C#中调用基础构造函数

Calling base constructor in C#

本问题已经有最佳答案,请猛点这里访问。

我有以下层次结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
2
3
4
5
6
7
8
9
class Derived : Base
{
  public Derived(string someParams)
    : base("Blah" + someParams)
  {

  }

}


你不能。你可以提前打电话给它:

1
public Derived() : base()

或者你必须用钩子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Base
{
  protected void init() { }
  public Base(string sMessage)
  {
     init();
  }
}

class Derived : Base
{
  public Derived(string someParams)
  {
   string sMessage ="Blah" + someParams;
   init();
  }
}


最初我错过了Oregonghost关于使用静态方法修改参数的评论,这对我来说是最有用的,所以我想为其他阅读此线程的人添加一个代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
    }
}

如果确实需要先运行构造函数,那么我建议使用受保护的初始化方法,该方法由构造函数调用,并执行初始化类的实际工作。您需要提供一个允许跳过初始化的备用构造函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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();
    }
}

施工人员注意事项:

·构造函数不能是"virtual"。

·它们不能被继承。

·按照继承顺序调用构造函数。

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

实际上,最简单的解决方案是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Base
{
  public Base(string sMessage)
  {
     //Do stuff
  }
}

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

}

为什么会让事情变得更复杂?


1
2
3
4
public Derived(string someParams) : base(someParams)
{
    string sMessage ="Blah" + someParams;
}

你必须这样做。您可以将以后要调用的代码放入基类中的受保护方法中,然后这样调用它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Base
{
  public Base(string sMessage)
  {
     ConstructorStuff();
  }

  protected Base()
  {
  }

  protected void ConstructorStuff()
  {
  }
}

class Derived : Base
{
  public Derived(string someParams)
  {    
   string sMessage ="Blah" + someParams;

   ConstructorStuff();      
  }    
}