Иерархия вызовов конструктора во время наследования - как с параметрами, так и без параметров
Прежде всего, это не повторяющийся вопрос.
Я знаю факты, которые:
- Во время наследования порядок выполнения конструкторов будет в том же порядке, что и их вывод, а порядок выполнения деструкторов будет в обратном порядке их вывода.
- Также мы можем явно вызвать конструктор базового класса, используя
base
Ключевое слово в определении конструктора.
Мой вопрос: для моего кода ниже
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();
}
}
Я получаю ошибку времени Complie:
'ClassA' does not contain a constructor that takes 0 arguments
'ClassB' does not contain a constructor that takes 0 arguments
Но когда я добавляю конструкторы по умолчанию к обоим классам как:
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
Это означает, что во время наследования всем базовым классам необходим конструктор без параметров.
Я пока не получил четкого объяснения этому. Пожалуйста, не делайте это как дубликат, и любое хорошее объяснение приветствуется.
1 ответ
Нет
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 ClassB : ClassA
{
public ClassB(int a):base(a)
{
Console.WriteLine("Parameterized Constructor of ClassB");
}
}
Кроме того, это не имеет ничего общего с порядком вызова конструкторов. Это происходит во время выполнения. У вас проблемы с компиляцией.