2017-10-04 9 views
-1

Ich versuche, von einer Basisklasse zu erben, aber ich bekomme einen Fehler, den ich nicht herausfinden kann. Dies ist die Basisklasse:C# Base Constructor Vererbung

class Item 
{ 
    protected string name; 

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

Und das ist die geerbte Klasse:

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; 
    } 
} 

Das Problem ist, diese Zeile:

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

wo 'name' mit der unterstrichen wird Fehlermeldung "Für das nicht statische Feld, die Methode oder die Eigenschaft 'Item.name' ist eine Objektreferenz erforderlich. Wenn ich sie durch ein String-Literal ersetze, ist die Fehlermeldung nicht vorhanden. Was mache ich? wro ng mit dem Erben des Konstruktors?

+1

Wenn Sie nicht über einen Parameternamen im Konstruktor von ItemToBuy haben, können Sie nicht den Konstruktor der Basisklasse aufrufen, die einen Namen erfordert Parameter. Wenn Sie es nicht haben, fügen Sie der Basisklasse, die keine Parameter annimmt, einen Konstruktor hinzu oder ändern Sie Ihren ItemToBuy-Konstruktor so, dass ein Name-Parameter zur Übergabe an die Basisklasse – Steve

+1

OK erforderlich ist. Denken Sie also eine Minute darüber nach. Die Basisklasse benötigt einen 'name'. Daher muss jede abgeleitete Klasse einen 'Namen' an den Basisklassenkonstruktor übergeben. Es kann das nicht einfach aus dem Nichts heraufbeschwören - entweder erzeugt die abgeleitete Klasse irgendwie einen 'Namen' und übergibt ihn an den Konstruktor der Basisklasse, oder' Name' muss ein Argument des Konstruktors der abgeleiteten Klasse sein und dann übergeben werden bis zum Konstruktor der Basisklasse. –

+1

Mögliches Duplikat von [C# "Für das nicht statische Feld, die Methode oder Eigenschaft ist eine Objektreferenz erforderlich"] (https://stackoverflow.com/questions/4817967/c-sharp-an-object-reference-is- required-for-the-non-static-field-Methode-or-pr) – Sinatr

Antwort

2

Sie müssen die Namen in dem Ctor der ItemToBuy Klasse haben auch

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; 
} 

soll geändert werden:

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

Sie die name Parameter in denen angeben müssen Konstruktor, nach meinem obigen Code.

+0

Stilistisch würde ich den Namen Parameter zuerst in den Konstruktor ItemToBuy setzen. – Polyfun

+0

Es hängt vom Kontext ab, ob das Sinn macht, aber yep @Polyfun, das ist sicherlich gültig. 'name' kann an jeder Stelle stehen (nicht unbedingt die erste oder letzte). – mjwills

3

Ihre ItemToBuy-Klasse hat keine Kenntnis von "name". Wie Sie den Konstruktor erstellen, muss "name" eine definierte Zeichenfolge sein.

Lassen Sie uns sagen, dass Ihr Konstruktor wie folgt aussieht:

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; 
    } 
} 

dies funktionieren wird, weil der Name Parameter definiert ist.

Also, Sie tun es entweder so oder übergeben Sie einen hardcoded Wert wie Sie es getan haben, damit es funktioniert.

+0

Upvoted, weil dies die einzige Antwort ist, die das Problem tatsächlich erklärt. –

0

müssen Sie den Namen in den Konstruktor von ItemToBuy erhalten:

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