继承过程中的构造函数调用层次——带参数和不带参数
Constructor calling hierarchy during inheritance-both with and without parameters
首先这不是一个重复的问题。
我知道以下事实:
- 在继承过程中,构造函数的执行顺序与派生顺序相同,析构函数的执行顺序与派生顺序相反。
- 此外,我们可以在构造函数定义中使用
base
关键字显式调用基础 class 构造函数。
我的问题是:
对于我下面的代码
class ClassA
{
public ClassA(int a)
{
Console.WriteLine("Parameterized Constructor of ClassA");
}
}
class ClassB : ClassA
{
public ClassB(int a)
{
Console.WriteLine("Parameterized Constructor of ClassB");
}
}
class ClassC : ClassB
{
public ClassC(int a)
{
Console.WriteLine("Parameterized Constructor of ClassC");
}
}
class Program
{
static void Main(string[] args)
{
ClassC classc = new ClassC(1);
Console.ReadLine();
}
}
我收到编译时间错误:
'ClassA' does not contain a constructor that takes 0 arguments
'ClassB' does not contain a constructor that takes 0 arguments
但是当我将默认构造函数添加到两个 classes 时:
class ClassA
{
public ClassA()
{
Console.WriteLine("Default Constructor of ClassA");
}
public ClassA(int a)
{
Console.WriteLine("Parameterized Constructor of ClassA");
}
}
class ClassB : ClassA
{
public ClassB()
{
Console.WriteLine("Default Constructor of ClassB");
}
public ClassB(int a)
{
Console.WriteLine("Parameterized Constructor of ClassB");
}
}
class ClassC : ClassB
{
public ClassC()
{
Console.WriteLine("Default Constructor of ClassC");
}
public ClassC(int a)
{
Console.WriteLine("Parameterized Constructor of ClassC");
}
}
class Program
{
static void Main(string[] args)
{
ClassC classc = new ClassC(1);
Console.ReadLine();
}
}
我得到了预期的输出。
Default Constructor of ClassA
Default Constructor of ClassB
Parameterized Constructor of ClassC
所以这意味着,在继承期间所有基 classes 需要一个无参数构造函数。
我还没有得到任何明确的解释。请不要将其重复,如有任何好的解释,我们将不胜感激。
没有
class ClassB : ClassA
{
public ClassB(int a)
{
Console.WriteLine("Parameterized Constructor of ClassB");
}
}
与
相同
class ClassB : ClassA
{
public ClassB(int a):base()
{
Console.WriteLine("Parameterized Constructor of ClassB");
}
}
编译器默认尝试调用基 class 的无参数构造函数。如果基础 class 没有无参数构造函数,则必须自己显式调用它:
class ClassB : ClassA
{
public ClassB(int a):base(a)
{
Console.WriteLine("Parameterized Constructor of ClassB");
}
}
此外,这与调用构造函数的顺序无关。那发生在运行时。您遇到编译时问题。
首先这不是一个重复的问题。
我知道以下事实:
- 在继承过程中,构造函数的执行顺序与派生顺序相同,析构函数的执行顺序与派生顺序相反。
- 此外,我们可以在构造函数定义中使用
base
关键字显式调用基础 class 构造函数。
我的问题是: 对于我下面的代码
class ClassA
{
public ClassA(int a)
{
Console.WriteLine("Parameterized Constructor of ClassA");
}
}
class ClassB : ClassA
{
public ClassB(int a)
{
Console.WriteLine("Parameterized Constructor of ClassB");
}
}
class ClassC : ClassB
{
public ClassC(int a)
{
Console.WriteLine("Parameterized Constructor of ClassC");
}
}
class Program
{
static void Main(string[] args)
{
ClassC classc = new ClassC(1);
Console.ReadLine();
}
}
我收到编译时间错误:
'ClassA' does not contain a constructor that takes 0 arguments
'ClassB' does not contain a constructor that takes 0 arguments
但是当我将默认构造函数添加到两个 classes 时:
class ClassA
{
public ClassA()
{
Console.WriteLine("Default Constructor of ClassA");
}
public ClassA(int a)
{
Console.WriteLine("Parameterized Constructor of ClassA");
}
}
class ClassB : ClassA
{
public ClassB()
{
Console.WriteLine("Default Constructor of ClassB");
}
public ClassB(int a)
{
Console.WriteLine("Parameterized Constructor of ClassB");
}
}
class ClassC : ClassB
{
public ClassC()
{
Console.WriteLine("Default Constructor of ClassC");
}
public ClassC(int a)
{
Console.WriteLine("Parameterized Constructor of ClassC");
}
}
class Program
{
static void Main(string[] args)
{
ClassC classc = new ClassC(1);
Console.ReadLine();
}
}
我得到了预期的输出。
Default Constructor of ClassA
Default Constructor of ClassB
Parameterized Constructor of ClassC
所以这意味着,在继承期间所有基 classes 需要一个无参数构造函数。
我还没有得到任何明确的解释。请不要将其重复,如有任何好的解释,我们将不胜感激。
没有
class ClassB : ClassA
{
public ClassB(int a)
{
Console.WriteLine("Parameterized Constructor of ClassB");
}
}
与
相同class ClassB : ClassA
{
public ClassB(int a):base()
{
Console.WriteLine("Parameterized Constructor of ClassB");
}
}
编译器默认尝试调用基 class 的无参数构造函数。如果基础 class 没有无参数构造函数,则必须自己显式调用它:
class ClassB : ClassA
{
public ClassB(int a):base(a)
{
Console.WriteLine("Parameterized Constructor of ClassB");
}
}
此外,这与调用构造函数的顺序无关。那发生在运行时。您遇到编译时问题。