不包含带0参数的构造函数

时间:2012-08-27 08:00:45

标签: c#-4.0 inheritance

似乎我收到一条错误,指出“产品不包含带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");
    }
}

6 个答案:

答案 0 :(得分:88)

有关C#的几条规则在这里发挥作用:

  1. 每个类都必须有一个构造函数(为了构造良好)

  2. 如果您不提供构造函数,编译器会自动为您提供构造函数,而不会自动更改。

    这意味着班级

    class Demo{}
    
    编译时

    提供一个空构造函数,变为

    class Demo{
       public Demo(){}
    }
    

    我能做到

    Demo instance = new Demo();
    
  3. 如果您确实提供了构造函数(任何具有任何签名的构造函数),则不会生成空构造函数

    class Demo{
       public Demo(int parameter){}
    }
    
    Demo instance = new Demo(); //this code now fails
    Demo instance = new Demo(3); //this code now succeeds
    

    这看起来有点违反直觉,因为添加代码似乎会破坏现有的无关代码,但这是C#团队的设计决策,我们必须忍受它。

  4. 当你调用派生类的构造函数时,如果你没有指定要调用的基类构造函数,编译器会调用空基类构造函数,所以

    class Derived:Base {
       public Derived(){}
    }
    

    变为

    class Derived:Base {
       public Derived() : base() {}
    }
    
  5. 因此,为了构造派生类,必须在基类上有一个无参数构造函数。看看如何向Products添加构造函数,并且编译器没有生成默认构造函数,您需要在代码中明确地添加它,如:

    public Products()
    {
    }
    

    或从派生构造函数

    显式调用它
    public FoodProduct()
           : base(string.Empty, string.Empty, 0, 0, 0, 0)
    {
    }
    

答案 1 :(得分:12)

由于Products没有构造函数接受0个参数,因此必须为FoodProducts创建一个构造函数,调用Products的构造函数将所有必需的参数。

在C#中,完成如下操作:

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参数的构造函数。

答案 2 :(得分:6)

继承类的构造函数需要首先构造基类。由于基类没有默认构造函数(取0个参数)而你没有使用现在的非默认构造函数,所以这不起作用。所以要么A)为你的基类添加一个默认的构造函数,在这种情况下,降序类的代码不需要改变;或者B)从降序类的构造函数中调用基类的非默认构造函数,在这种情况下,基类不需要更改。

A

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 here上解释了其中的一些内容。

答案 3 :(得分:3)

当您从Products继承时,您必须在自己的班级中调用Products的基本构造。

你没有写:base(id, name, ....)所以C#假定你调用默认的无参数构造函数,但它不存在。

Products创建默认的无参数构造函数。

答案 4 :(得分:1)

添加

public Products()
{

}

在您的产品类中并且您不会收到错误

<强>原因: 每个类都有一个带0参数的默认构造函数。所以不需要显式地定义/写它(由程序员)但是当你用你想要的数量和参数类型重载一个默认构造函数时,那么你自己(显式地)定义默认构造函数以及你的重载构造函数

答案 5 :(得分:-1)

您还可以在父类中使用带有参数的构造函数,如:

public Products ()
{
}