Базовый класс не содержит конструктор без параметров?
Я делаю мои конструкторы немного более строгими, удаляя некоторые из моих пустых конструкторов. Я новичок в наследовании и был озадачен ошибкой, которую я получил: базовый класс не содержит конструктор без параметров. Как я могу наследовать A2 от A без наличия пустого конструктора в A. Также, для моего личного понимания, почему A2 требует пустой конструктор для A?
Class A{
//No empty constructor for A
//Blah blah blah...
}
Class A2 : A{
//The error appears here
}
Ответы
Ответ 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)
}