Почему для базового класса необходимо иметь конструктор, который принимает 0 аргументов?
Это не скомпилируется:
namespace Constructor0Args
{
class Base
{
public Base(int x)
{
}
}
class Derived : Base
{
}
class Program
{
static void Main(string[] args)
{
}
}
}
Вместо этого возникает следующая ошибка:
'Constructor0Args.Base' не содержит конструктор, который принимает 0 аргументов
Почему? Нужно ли для базового класса иметь конструктор, который принимает 0 аргументов?
Ответы
Ответ 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)
{
}
}