Подтвердить что ты не робот

Почему для базового класса необходимо иметь конструктор, который принимает 0 аргументов?

Это не скомпилируется:

namespace Constructor0Args
{
    class Base
    {
        public Base(int x)
        {
        }
    }

    class Derived : Base
    {
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Вместо этого возникает следующая ошибка:

'Constructor0Args.Base' не содержит конструктор, который принимает 0 аргументов

Почему? Нужно ли для базового класса иметь конструктор, который принимает 0 аргументов?

4b9b3361

Ответ 1

Это не так: проблема заключается в том, что для инициализации базового типа ему нужно вызвать базовый конструктор some, а по умолчанию - вызов base(). Вы можете настроить это, указав конкретный конструктор (и аргументы) самостоятельно в конструкторе производных типов:

class Derived : Base
{
    public Derived() : base(123) {}
}

Для параметров конструкторов base (или, альтернативно, this) вы можете использовать:

  • для текущего конструктора
  • литералы/константы
  • вызовы статического метода (также связанные с указанным выше)

Например, справедливо также следующее: все три пули:

class Derived : Base
{
    public Derived(string s) : base(int.Parse(s, NumberStyles.Any)) {}
}

Ответ 2

При выводе класса из другого базовый класс будет вызываться перед конструктором производных классов. Когда вы явно не вызываете конструктор, вы, по существу, пишете

class Derived : Base
{
    public Derived() : base()
    {
    }
}

Поскольку класс Base не имеет конструктора аргументов 0, это недопустимо.

Ответ 3

Если вы явно не определяете конструктор для класса, автоматически определяется конструктор по умолчанию, который выглядит следующим образом:

public Derived() : base() 
{
}

Вам нужно указать конструктор в базовом классе, а также какие аргументы передать ему:

public Derived() : base(1) 
{
}

Ответ 4

Это происходит, когда создается дочерний класс, он также создает экземпляр базового класса. По умолчанию он попытается найти конструктор arg less. Это работа с этим кодом:

class Base
    {
        public Base(int x) { }
    }
    class Derived : Base
    {
        public Derived(int x)
            : base(x)
        {
        }
    }