拥有这样的代码:
class A
{
public A(int x)
{}
}
class B:A
{
public B(int x):base(3)
{}
}
我不明白。 B类是A类的独立子,为什么我需要调用它的构造函数?我很困惑,因为看起来我创建B的实例时会创建A的实例。
答案 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