2017-10-04 14 views
-1

私は基底クラスから継承しようとしていますが、私は理解できないというエラーが発生しています。これは、基底クラスである:C#Baseコンストラクタの継承

class Item 
{ 
    protected string name; 

    public Item(string name) 
    { 
     this.name = name; 
    } 
} 

そして、これは継承されたクラスです。

class ItemToBuy : Item 
{ 
    private int lowPrice; 
    private int highPrice; 
    private int maxQuantity; 

    public ItemToBuy(int lowPrice, int highPrice, int maxQuantity) : base(name) 
    { 
     this.lowPrice = lowPrice; 
     this.highPrice = highPrice; 
     this.maxQuantity = maxQuantity; 
    } 
} 

問題この行です: '名前は' で下線が引かれ

public ItemToBuy(int lowPrice, int highPrice, int maxQuantity) : base(name)

エラーメッセージ "非静的フィールド、メソッドまたはプロパティ 'Item.name'にオブジェクト参照が必要です。文字列リテラルで置き換えると、エラーメッセージは表示されません。コンストラクタを継承していますか?

+1

あなたがItemToBuyのコンストラクタにパラメータ名を持っていない場合、あなたが名前を必要とする基底クラスのコンストラクタを呼び出すことはできませんパラメータ。あなたがそれを持っていない場合は、パラメータを取らない基本クラスにコンストラクタを追加するか、Nameクラスを基本クラス – Steve

+1

に渡すようにItemToBuyコンストラクタを変更してください。基本クラスには 'name'が必要です。したがって、派生したクラスはいずれも 'name'を基本クラスのコンストラクタに渡す必要があります。これは、空から派生するだけでは、派生クラスはどうにかして 'name'を作成してそれを基本クラスのコンストラクタに渡すか、' name'は派生クラスのコンストラクタの引数でなければなりません基本クラスのコンストラクタに渡します。 –

+1

[C# "非静的フィールド、メソッド、またはプロパティにオブジェクト参照が必要です"]の複製があります。(https://stackoverflow.com/questions/4817967/c-sharp-an-object-reference-is- static-field-method-or-pr) – Sinatr

答えて

2
あなたはItemToBuyクラスのctorの中で名前を持っている必要があります

すぎ

public ItemToBuy(string name ,int lowPrice, int highPrice, int maxQuantity) : base(name) 
0
public ItemToBuy(int lowPrice, int highPrice, int maxQuantity) : base(name) 
{ 
    this.lowPrice = lowPrice; 
    this.highPrice = highPrice; 
    this.maxQuantity = maxQuantity; 
} 

は、次のように変更します。

public ItemToBuy(int lowPrice, int highPrice, int maxQuantity, string name) : base(name) 
{ 
    this.lowPrice = lowPrice; 
    this.highPrice = highPrice; 
    this.maxQuantity = maxQuantity; 
} 

あなたにはnameパラメータを指定する必要がありますコンストラクタ、上記の私のコードに従って。

+0

Stylistically、私はItemToBuyコンストラクタの中で最初に名前パラメータを配置します。 – Polyfun

+0

それは意味があるかどうかに関しては文脈に依存するが、確かに有効な@Polyfunがある。 'name'はどの位置にあってもかまいません(必ずしも最初か最後かは関係ありません)。 – mjwills

3

あなたのItemToBuyクラスには、「名前」についての知識がありません。 コンストラクタを構築する方法は、 "name"が定義された文字列である必要があります。

のは、あなたのコンストラクタは次のようになりますことを言ってみましょう:nameパラメータが定義されているので、

class ItemToBuy : Item 
{ 
    private int lowPrice; 
    private int highPrice; 
    private int maxQuantity; 

    public ItemToBuy(int lowPrice, int highPrice, int maxQuantity, string name) : base(name) 
    { 
     this.lowPrice = lowPrice; 
     this.highPrice = highPrice; 
     this.maxQuantity = maxQuantity; 
    } 
} 

が、これは動作します。

だから、そうするか、ハードコーディングされた値を渡します。

+0

これは問題を実際に説明する唯一の答えであるため、アップしています。 –

0

あなたがItemToBuyのコンストラクタに名前を受信する必要があります。

public ItemToBuy(int lowPrice, int highPrice, int maxQuantity,string name) : base(name) 
関連する問題