Иерархия вызовов конструктора во время наследования - как с параметрами, так и без параметров

Прежде всего, это не повторяющийся вопрос.

Я знаю факты, которые:

  • Во время наследования порядок выполнения конструкторов будет в том же порядке, что и их вывод, а порядок выполнения деструкторов будет в обратном порядке их вывода.
  • Также мы можем явно вызвать конструктор базового класса, используя 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");
    }
}

Кроме того, это не имеет ничего общего с порядком вызова конструкторов. Это происходит во время выполнения. У вас проблемы с компиляцией.

Другие вопросы по тегам