繁体   English   中英

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

[英]Why to call base constructor?

有这样的代码:

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

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

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

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

B并非独立于A类:它继承了 A类,因此是该类的“扩展”。

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

如果你不调用基类的构造,是怎样一个应该知道的是, int x在B是相同的int x如A?

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

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

原因是基于类的类定义其构造函数需要一个参数。 您正在继承,因此您必须遵守 A要求。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM