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

したがって、派生クラスを構築するには、基本クラスにパラメーターなしのコンストラクターが必要です。コンストラクターを製品に追加した方法を確認し、コンパイラーがデフォルトのコンストラクターを生成しなかった場合は、次のように明示的にコードに追加する必要があります。

public Products()
{
}

または派生コンストラクターから明示的に呼び出す

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

Products引数を 0 とるコンストラクターがないため、必要なすべての引数のコンストラクターを呼び出すためのコンストラクターを作成する必要がありますFoodProductsProducts

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

B

public class Products
{
    public class Products(args) { }
}

public class FoodProducts : Products
{
    public FoodProducts(args) : base(args) { }
}

これのいくつかは、msdn hereでかなり説明されています。

于 2012-08-27T08:07:40.767 に答える
2

追加するだけ

public Products()
{

}

あなたの製品クラスでは、エラーは発生しません

理由: すべてのクラスに、パラメータが 0 のデフォルト コンストラクタが存在します。したがって、(プログラマーが)明示的に定義/記述する必要はありませんが、デフォルトのコンストラクターを目的の数とタイプのパラメーターでオーバーロードすると、オーバーロードされたコンストラクターとともにデフォルトのコンストラクターを自分で(明示的に)定義することが強制されます

于 2012-08-27T09:40:19.920 に答える