Базовый класс не содержит конструктор без параметров? - PullRequest
49 голосов
/ 07 октября 2011

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

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

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

Ответы [ 6 ]

86 голосов
/ 07 октября 2011

В классе 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
    }
}
8 голосов
/ 07 октября 2011

Пример:

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

class A
{
    A(int something)
    {
        ...
    }
}
2 голосов
/ 07 октября 2011

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

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

class A2 : A
{
    public A2()
        : base(new Foo())
    {
    }
}
1 голос
/ 07 октября 2011

имеет для вызова какого-либо конструктора.По умолчанию используется вызов 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))
        {
        }
    }
.
0 голосов
/ 12 июня 2016

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

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

Class A2 : A{
    public A2():base(some parameter)
}
0 голосов
/ 07 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...