为什么要调用基础构造函数?

时间:2011-04-04 10:58:33

标签: c# inheritance constructor

拥有这样的代码:

class A
{
  public A(int x)
  {}
}
class B:A
{
  public B(int x):base(3)
  {}
}

我不明白。 B类是A类的独立子,为什么我需要调用它的构造函数?我很困惑,因为看起来我创建B的实例时会创建A的实例。

8 个答案:

答案 0 :(得分:4)

调用基类构造函数可以初始化从基类继承的内容。

class A
{
  private int foo;
  public int Foo { get { return foo; } }
  public A(int x)
  {
      foo = x;
      OpenConnectionOrSomething();
  }
}
class B:A
{
  public B(int x) : base(x)
  {
      // can't initialize foo here: it's private
      // only the base class knows how to do that
  }

  // this property uses the Foo property initialized in the base class 
  public int TripleOfFoo { get { return 3*Foo; } }
}

答案 1 :(得分:3)

B 独立于A类:它继承A,因此是该类的“扩展”。< / p>

创建A时,您不会创建B的单独实例; A的功能是您正在创建的内容的一部分。调用A的构造函数允许在必要时初始化该函数。

答案 2 :(得分:1)

如果你没有调用基础构造函数,A怎么知道B中的int x与A中的int x相同?

答案 3 :(得分:1)

A类没有无参数构造函数,因此你必须从B的构造函数中调用A(int x)。

答案 4 :(得分:1)

B继承自A,因此当您创建B的实例时,它也是A,因此需要调用A的构造函数来进行任何初始化。

答案 5 :(得分:1)

原因是基于类定义它需要一个参数作为其构造函数。您继承,因此您必须尊重 A的要求。

答案 6 :(得分:0)

当您创建派生类的实例时,总是必须调用基础构造函数,没有办法解决它。但是,如果基类具有无参数构造函数,那么您不必指定对基础构造函数的调用,如果将其保留,它将隐式调用无参数构造函数。如果基类没有无参数构造函数(如示例所示),则必须指定要调用的基础构造函数以及要发送给它的参数。

当您创建类B的实例时,您有点创建类A的实例,因为B实例 A个实例。必须调用基类中的构造函数来初始化您可能继承的任何成员。该对象首先初始化为A实例,然后初始化为B实例。

答案 7 :(得分:-2)

当您创建B时,会创建A的实例,因为B继承了实例A