似乎我收到一条错误,指出“产品不包含带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");
}
}
答案 0 :(得分:88)
有关C#的几条规则在这里发挥作用:
每个类都必须有一个构造函数(为了构造良好)
如果您不提供构造函数,编译器会自动为您提供构造函数,而不会自动更改。
这意味着班级
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
这看起来有点违反直觉,因为添加代码似乎会破坏现有的无关代码,但这是C#团队的设计决策,我们必须忍受它。
当你调用派生类的构造函数时,如果你没有指定要调用的基类构造函数,编译器会调用空基类构造函数,所以
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)
{
}
答案 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 ()
{
}