Почему базовый класс должен иметь конструктор, который принимает 0 аргументов? - PullRequest
22 голосов
/ 11 февраля 2011

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

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

    class Derived : Base
    {
    }

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

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

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

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

Ответы [ 4 ]

29 голосов
/ 11 февраля 2011

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

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

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

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

Например, следующие значения также действительны, используя все три пункта выше:

class Derived : Base
{
    public Derived(string s) : base(int.Parse(s, NumberStyles.Any)) {}
}
13 голосов
/ 11 февраля 2011

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

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

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

7 голосов
/ 11 февраля 2011

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

public Derived() : base() 
{
}

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

public Derived() : base(1) 
{
}
0 голосов
/ 11 февраля 2011

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

class Base
    {
        public Base(int x) { }
    }
    class Derived : Base
    {
        public Derived(int x)
            : base(x)
        {
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...