2017-10-04 3 views
-1

J'essaie d'hériter d'une classe de base, mais j'obtiens une erreur que je n'arrive pas à comprendre. Ceci est la classe de base:C# Héritage du constructeur de base

class Item 
{ 
    protected string name; 

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

Et c'est la classe héritée:

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

La question est cette ligne:

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

où 'nom' est soulignée par la message d'erreur "Une référence d'objet est requise pour le champ non-statique, la méthode ou la propriété" Item.name ".Si je le remplace par une chaîne littérale le message d'erreur n'est pas là. ng avec hériter du constructeur?

+1

Si vous ne disposez pas d'un nom de paramètre dans le constructeur de ItemToBuy, vous ne pouvez pas appeler le constructeur de la classe de base qui nécessite un nom paramètre. Si vous ne l'avez pas, ajoutez un constructeur à la classe de base qui ne prend aucun paramètre ou changez votre constructeur ItemToBuy pour exiger un paramètre de nom à transmettre à la classe de base – Steve

+1

OK, alors pensez à cela pendant une minute. La classe de base a besoin d'un 'nom'. Par conséquent toute classe dérivée va devoir passer un 'nom' au constructeur de la classe de base. Il ne peut pas simplement le faire sortir de nulle part - soit la classe dérivée crée un 'nom' en quelque sorte et le passe au constructeur de la classe de base, ou' name' doit être un argument du constructeur de la classe dérivée, puis passé à travers au constructeur de la classe de base. –

+1

Copie possible de [C# "Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique"] (https://stackoverflow.com/questions/4817967/c-sharp-an-object-reference-is- required-for-the-non-static-field-method-or-pr) – Sinatr

Répondre

2

Vous devez avoir le nom dans le cteur de la classe ItemToBuy trop

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

devrait être remplacé:

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

Vous devez spécifier le paramètre name dans la constructeur, selon mon code ci-dessus.

+0

Stylistiquement, je mettrais le paramètre name en premier dans le constructeur ItemToBuy. – Polyfun

+0

Cela dépend du contexte si cela a du sens, mais oui @Polyfun qui est certainement valide. 'name' peut être n'importe quelle position (pas nécessairement la première ou la dernière). – mjwills

3

votre classe ItemToBuy n'a aucune connaissance de "name". La façon dont vous construisez le constructeur, "nom" doit être une chaîne définie.

Disons que votre constructeur ressemble à ceci:

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

Cela fonctionnera, car le paramètre de nom est défini. Donc, soit vous faites ça comme ça, soit vous passez une valeur codée en dur comme vous l'avez fait pour que ça marche.

+0

Upvoted parce que c'est la seule réponse qui explique réellement le problème. –

0

vous devez recevoir le nom du constructeur de ItemToBuy:

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