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

Базовый класс не содержит конструктор без параметров?

Я делаю мои конструкторы немного более строгими, удаляя некоторые из моих пустых конструкторов. Я новичок в наследовании и был озадачен ошибкой, которую я получил: базовый класс не содержит конструктор без параметров. Как я могу наследовать A2 от A без наличия пустого конструктора в A. Также, для моего личного понимания, почему A2 требует пустой конструктор для A?

Class A{
    //No empty constructor for A
    //Blah blah blah...
}

Class A2 : A{
    //The error appears here
}
4b9b3361

Ответ 1

В классе A2 вам нужно убедиться, что все ваши конструкторы вызывают конструктор базового класса с параметрами.

В противном случае компилятор предположит, что вы хотите использовать конструктор безразмерного базового класса для построения объекта A, на котором основан ваш объект A2.

Пример:

class A
{
    public A(int x, int y)
    {
        // do something
    }
}

class A2 : A
{
    public A2() : base(1, 5)
    {
        // do something
    }

    public A2(int x, int y) : base(x, y)
    {
        // do something
    }

    // This would not compile:
    public A2(int x, int y)
    {
        // the compiler will look for a constructor A(), which doesn't exist
    }
}

Ответ 2

Пример:

class A2 : A
{
   A2() : base(0)
   {
   }
}

class A
{
    A(int something)
    {
        ...
    }
}

Ответ 3

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

class A
{
    public A(Foo bar)
    {
    }
}

class A2 : A
{
    public A2()
        : base(new Foo())
    {
    }
}

Ответ 4

Он должен вызвать некоторый конструктор. По умолчанию используется вызов base().

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

  public static class MyStaticClass
    {
        public static int DoIntWork(string i)
        {
            //for example only
            return 0;
        }
    }

    public class A
    {
        public A(int i)
        {
        }
    }

    public class B : A
    {
        public B(string x) : base(MyStaticClass.DoIntWork(x))
        {
        }
    }

Ответ 5

Так как если A не имеет конструктора по умолчанию, то конструктор A2 должен вызывать base() с аргументами для конструктора A. См. этот вопрос: Вызов базового конструктора в С#

Ответ 6

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

Class A{
    //No empty constructor for A
    //Blah blah blah...
}

Class A2 : A{
    public A2():base(some parameter)
}