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

Не содержит конструктор, который принимает 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");
    }
}
4b9b3361

Ответ 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 ()
{
}