[英]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.