2016-06-06 11 views
0

Also habe ich diese BasisklasseWie Basisklasse setzt die Werte in dem abgeleiteten Konstruktor

abstract class Item 
{ 
    private int x, y, ataque, defesa, saude, raridade; 
    private char appearance; 
    private bool pickedUp; 
    private readonly Random rng = new Random(); 

    public Item(Map argMap, int argAtaque, int argDefesa, int argSaude, int argRaridade, char argAppearance) 
    { 
     bool empty = false; 
     while (!empty) 
     { 
      x = rng.Next(1, argMap.ReLengthX() - 1); 
      y = rng.Next(1, argMap.ReLengthY() - 1); 
      if (!argMap.CheckTile(y, x)) empty = true; 
     } 
     pickedUp = false; 
     ataque = argAtaque; 
     defesa = argDefesa; 
     saude = argSaude; 
     raridade = argRaridade; 
     appearance = argAppearance; 
    } 
} 

Und ich habe diese abgeleiteten Klasse

class Armadura : Item 
{ 
    public Armadura(Map argMap, int ataque, int defesa, int saude, int raridade, char appearance) : base(argMap, ataque, defesa, saude, raridade, appearance) 
    { 
     ataque = -1; 
     defesa = 2; 
     saude = 0; 
     raridade = ReRNG().Next(Convert.ToInt32(Math.Round(argMap.ReLengthY() * 0.02)), Convert.ToInt32(Math.Round(argMap.ReLengthY() * 0.04))); 
     appearance = ' '; 
    } 
} 

meine Frage ist also, wie komme ich zu setze die Werte auf: base, benutze die Werte, die ich für den abgeleiteten Konstruktor gesetzt habe (zum Beispiel, setze die Basis argAtaque mit ataawwww, daher ist argAtaque gleich '-1')? Ich habe versucht, dies mit ein paar Möglichkeiten, aber ich habe das nicht irgendwie funktionieren. Ich danke Ihnen im Voraus!

+4

Der Aufruf von ': base (...)' ruft den Basiskonstruktor auf, der die Felder in der Basisklasse festlegt. Wolltest du das nicht? –

+0

Es scheint, dass Visual Studio behauptet, dass die Werte, die ich im abgeleiteten Konstruktor definiere, niemals verwendet werden. – EpaXapate

+0

Das stimmt, Sie ändern die Parameter in die Methode * nachdem * sie an den Basiskonstruktor übergeben wurden. Wenn Sie immer -1 für "ataque" (in diesem Fall) übergeben möchten, sollten Sie den Aufruf einfach wie folgt in "base" ändern: ': base (argMap, -1, 2, 0, CallToStaticMethodThatProducesRaridade(), '') ; 'Außerdem, wenn Sie wirklich die Parameter * bis * dieses Konstruktors mehr brauchen, würden Sie höchstwahrscheinlich nur 'argMap' benötigen. –

Antwort

0

Die Syntax : base() funktioniert für Konstanten und Parameter, aber nicht für komplexere Ausdrücke mit Nebenwirkungen (wie Sie gefunden haben).

Sie benötigen eine Initialisierungsmethode für die Basisklasse.

abstract class Item 
{ 
    ... 

    // If you use this constructor, call Setup() afterwards. 
    public Item() {} 

    // Constructor including a call to Setup() 
    public Item(Map argMap, int argAtaque, int argDefesa, int argSaude, int argRaridade, char argAppearance) 
    { 
     Setup(argMap, argAtaque, argDefesa, argSaude, argRaridade, argAppearance); 
    } 

    // Sets private variables for this Item 
    protected void Setup(Map argMap, int argAtaque, int argDefesa, int argSaude, int argRaridade, char argAppearance) 
    { 
     bool empty = false; 
     while (!empty) 
     { 
      x = rng.Next(1, argMap.ReLengthX() - 1); 
      y = rng.Next(1, argMap.ReLengthY() - 1); 
      if (!argMap.CheckTile(y, x)) empty = true; 
     } 
     pickedUp = false; 
     ataque = argAtaque; 
     defesa = argDefesa; 
     saude = argSaude; 
     raridade = argRaridade; 
     appearance = argAppearance; 
    } 
} 

Jetzt können Sie Setup die Basisklasse mit den berechneten Werten:

class Armadura : Item 
{ 
    public Armadura(Map argMap) 
    { 
     int ataque = -1; 
     int defesa = 2; 
     int saude = 0; 
     int raridade = ReRNG().Next(Convert.ToInt32(Math.Round(argMap.ReLengthY() * 0.02)), Convert.ToInt32(Math.Round(argMap.ReLengthY() * 0.04))); 
     char appearance = ' '; 

     Setup(argMap, ataque, defesa, saude, raridade, appearance); 
    } 
0

Alles, was Sie tun müssen, um ataque im Kindkonstruktors gesetzt, da es außer Kraft setzen, was ataque eingestellt wird, um in deine Basisklasse. Der Basiskonstruktor wird zuerst und dann der Kindkonstruktor aufgerufen.

Damit dies funktioniert, müssen Sie Ihre privaten Variablen in der Basisklasse schützen. Dadurch werden sie in der Child-Klasse privat.

Verwandte Themen