我今天在接受采访时被问到,如果在C#抽象类" C"中,是由抽象类" B"继承,具体类" A"继承" B",如果" A"使用哪个构造函数?没有,我假设" C"因为父母有优先权,但不确定。
答案 0 :(得分:2)
形成A <- B <- C
的类层次结构,因此两者按特定顺序使用和调用。
abstract class C
{
public C()
{
Console.WriteLine("C()");
}
}
abstract class B : C
{
public B()
{
Console.WriteLine("B()");
}
}
class A : B
{
}
void Main()
{
A a = new A();
}
输出:
C()
B()
在C#中,您不需要显式调用基础构造函数,它将被隐式调用。因此,默认构造函数A()
将调用B()
,它将调用C()
。
如果构造函数签名不同,那该怎么办?
如果B
或C
的构造函数有参数(没有可用的参数构造函数),那么编译器会强制您使用base
关键字提供参数。
abstract class C
{
public C(int foo)
{
Console.WriteLine("C()");
}
}
abstract class B : C
{
public B()
: base(0 /* foo must be provided */)
{
Console.WriteLine("B()");
}
}