43

我从以下代码中收到一条错误消息,指出“产品不包含采用 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");
    }
}
4

5 回答 5

116

关于 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() {}
    }
    

所以,为了构造你的派生类,你必须在基类上有一个无参数的构造函数。看到您如何向 Products 添加构造函数,并且编译器没有生成默认构造函数,您需要在代码中显式添加它,例如:

public Products()
{
}

或从派生的构造函数中显式调用它

public FoodProduct()
       : base(string.Empty, string.Empty, 0, 0, 0, 0)
{
}
于 2012-08-27T08:39:30.530 回答
18

由于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

于 2012-08-27T08:10:29.440 回答
8

被继承类的构造函数需要先构造基类。由于基类没有默认构造函数(采用 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 here上解释得相当不错。

于 2012-08-27T08:07:40.767 回答
3

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

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

为 .创建一个默认的无参数构造函数Products

于 2012-08-27T08:06:42.380 回答
2

只需添加

public Products()
{

}

在你的产品类中你不会得到错误

原因: 每个类都存在一个参数为 0 的默认构造函数。因此,无需(由程序员)显式定义/编写它,但是当您使用所需数量和类型的参数重载默认构造函数时,您必须自己(显式)定义默认构造函数以及重载的构造函数

于 2012-08-27T09:40:19.920 回答