Не содержит конструктор, который принимает 0 аргументов
Кажется, я получаю сообщение об ошибке "Продукты не содержат конструктор, который принимает 0 аргументов
public class Products
{
string id;
string name;
double price;
int soldCount;
int stockCount;
public Products(string id, string name, double price,
int soldCount, int stockCount, double tax)
{
this.id = id;
this.name = name;
this.price = price;
this.soldCount = soldCount;
this.stockCount = stockCount;
}
}
//I have got some get and set values for the code above
//but it would have been too long to put in here
public class FoodProducts : Products
{
public FoodProduct()
{
Console.WriteLine("This is food product");
}
public void Limit()
{
Console.WriteLine("This is an Attribute of a Product");
}
}
Ответы
Ответ 1
Здесь вы найдете несколько правил о С#:
-
Каждый класс должен иметь конструктор (для корректного построения)
-
Если вы не предоставите конструктор, вам будет предоставлен конструктор, свободный от изменений, автоматически компилятором.
Это означает, что класс
class Demo{}
при компиляции предоставляется пустой конструктор, становясь
class Demo{
public Demo(){}
}
и я могу сделать
Demo instance = new Demo();
-
Если вы предоставите конструктор (любой конструктор с любой сигнатурой), пустой конструктор не будет сгенерирован
class Demo{
public Demo(int parameter){}
}
Demo instance = new Demo(); //this code now fails
Demo instance = new Demo(3); //this code now succeeds
Это может показаться немного противоречивым, поскольку добавление кода, похоже, нарушает существующий несвязанный код, но это дизайнерское решение команды С#, и мы должны жить с ним.
-
Когда вы вызываете конструктор производного класса, если вы не укажете конструктор базового класса, который должен быть вызван, компилятор вызывает пустой конструктор базового класса, поэтому
class Derived:Base {
public Derived(){}
}
становится
class Derived:Base {
public Derived() : base() {}
}
Итак, чтобы построить производный класс, вы должны иметь конструктор без параметров в базовом классе. Увидев, как вы добавили конструктор к Продуктам, и компилятор не создал конструктор по умолчанию, вам нужно явно добавить его в свой код, например:
public Products()
{
}
или явно вызвать его из производного конструктора
public FoodProduct()
: base(string.Empty, string.Empty, 0, 0, 0, 0)
{
}
Ответ 2
Так как Products
не имеет конструктора, который принимает 0 аргументов, вы должны создать конструктор для FoodProducts
, который вызывает конструктор Products
, все необходимые аргументы.
В С# это делается следующим образом:
public class FoodProducts : Products
{
public FoodProducts(string id, string name, double price, int soldCount, int stockCount, double tax)
: base(id, name, price, soldCount, stockCount, tax)
{
}
public void Limit()
{
Console.WriteLine("This is an Attribute of a Product");
}
}
Если вы не хотите добавлять этот конструктор в FoodProducts
, вы также можете создать конструктор без параметра Products
.
Ответ 3
конструктор унаследованного класса должен сначала построить базовый класс. так как базовый класс не имеет конструктора по умолчанию (принимает 0 аргументов), и вы не используете конструктор, не имеющий значения по умолчанию, который у вас есть сейчас, это не сработает. поэтому либо A) добавьте конструктор по умолчанию в ваш базовый класс, и в этом случае код нисходящего класса не нуждается в изменении; или B) вызвать конструктор базового класса по умолчанию, не являющийся по умолчанию, из конструктора нисходящего класса, и в этом случае базовый класс не нуждается в изменении.
А
public class Products
{
public Products() { }
}
public class FoodProducts : Products
{
public FoodProducts() { }
}
В
public class Products
{
public class Products(args) { }
}
public class FoodProducts : Products
{
public FoodProducts(args) : base(args) { }
}
часть этого объясняется довольно хорошо на msdn здесь.
Ответ 4
Как вы наследуете от Products
, вы должны вызвать базовую конструкцию Products
в своем собственном классе.
Вы не пишете :base(id, name, ....)
, поэтому С# предполагает, что вы вызываете конструктор без параметров без параметров. Но он не существует.
Создайте конструктор без параметров без параметров для Products
.
Ответ 5
Просто добавьте
public Products()
{
}
в вашем классе продуктов И вы не получите ошибку
Причина:
Существует конструктор по умолчанию с параметром 0 для каждого класса. Поэтому нет необходимости определять/записывать его явно (программистом), но когда вы перегружаете конструктор по умолчанию с нужным количеством и типом параметров, тогда становится принуждением самостоятельно определять конструктор по умолчанию (явно) вместе с вашим перегруженным конструктором
Ответ 6
Вы также можете использовать конструктор без параметров в своем родительском классе, например:
public Products ()
{
}