2012-08-27 63 views
25

看來,我得到一個錯誤消息:「產品不包含一個構造函數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"); 
    } 
} 
+7

上課通常的命名約定是單數,不是複數(如:'Product',而不是'Products'),因爲一個類定義類型,然後可以實例化。無論你是否擁有更多這些,都不應該成爲命名約定的一部分。 –

+1

可能重複的[C#錯誤:父母不包含一個構造函數,它需要0參數](http://stackoverflow.com/questions/7230544/c-sharp-error-parent-does-not-contain-a-constructor- that-takes-0-arguments) – nawfal

回答

3

當你從Products繼承,你必須調用的基本結構Products在自己的類。

你沒寫:base(id, name, ....)所以C#假設你調用默認參數的構造函數,但它不存在。

創建一個默認的無參數ç onstructor for Products

5

繼承類的構造函數需要先構造基類。由於基類沒有默認構造函數(取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) { } 
} 

一些這方面進行了說明,而OK MSDN上here

+1

+1:我剛剛遇到了同樣的錯誤:「[class]不包含帶0參數的構造函數」。問題是基類和每個子類都有一個定義的構造函數。解決方案是確保每個子類稱爲「:base(...)「來初始化父類。 – paulsm4

9

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

77

關於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() {} 
    } 
    

因此,爲了構建派生類,您必須在基類上有一個無參數構造函數。看到你如何添加一個構造函數的產品,並且編譯器沒有生成默認的構造函數,你需要明確地添加它在你的代碼,如:從派生構造

public Products() 
{ 
} 

或顯式調用

public FoodProduct() 
     : base(string.Empty, string.Empty, 0, 0, 0, 0) 
{ 
} 
1

只需添加

public Products() 
{ 

} 

在你的產品類,你不會得到錯誤

原因: 存在一個默認構造函數,每個類都帶有0參數。所以不需要顯式地定義/寫入(通過程序員),但是當你用你想要的數量和參數類型重載一個默認構造函數時,那麼它就成爲一個強制定義你的默認構造函數(顯式地)和你的重載構造函數

-1

您還可以使用帶出PARAMATERS構造像你的父類:

public Products() 
{ 
} 
相關問題