Sono leggermente confuso sul motivo per cui sono in grado di utilizzare il "questo" nelle classi astratte.La parola chiave "this" nelle classi astratte
Sto creando un gioco di ruolo orientato agli oggetti molto semplice. Ho una base/super classe chiamata Items
. Ho quindi due tipi di articoli, equiptable e non-equiptable.
interface IEquiptable
{
void equiptItem(Player p);
void unequiptItem(Player p);
}
Theres l'interfaccia per articoli equiptable.
Avanti, ho una classe astratta chiamata Weapons
:
abstract class Weapons : Items, IEquiptable
{
public double powerOfWeapon { get; set; }
public double powerNeededToUse { get; set; }
public void equiptItem(Player p)
{
Console.WriteLine(this);
p.weapon = this;
}
public void unequiptItem(Player p)
{
//UNTESTED METHOD
p.weapon = new Swords("Fists", 1, 1);
}
}
Questo si estende la classe base di Items
(questa classe contiene solo un nome per la voce in questo momento, quindi non vale la pena spettacolo) ed implementa la interfaccia 'IEquiptable'.
Finalmente ho una classe chiamata Swords
class Swords : Weapons
{
public Swords(string name, double powerOfS, double powerToU)
{
base.name = name;
powerOfWeapon = powerOfS;
powerNeededToUse = powerToU;
}
}
Questo si estende armi e fornisce un costruttore per la spada.
Ecco alcuni dei miei Player
classe
class Player
{
public string Name { get; set; }
public double life { get; set; }
public double power { get; set; }
public Weapons weapon { get; set; } // Currently held weapon
private List<Items> items; //This is being used to represent a 'backpack' any item obtained will be added here.
Per eqipt un'arma Sto usando questo metodo: (nella mia classe di giocatore)
public void equiptWeapon()
{
Weapons tempWep = items.OfType<Weapons>().FirstOrDefault();
if (tempWep != null)
{
tempWep.equiptItem(this);
}
}
Non capisco perché questo funziona. a tempWep viene assegnato il valore della prima arma nell'elenco. Ma poi chiama il metodo equiptItem()
che viene implementato dalla classe astratta e quindi "questo" viene assegnato, che non posso seguire come non genera un errore per non essere inizializzato Weapons
Speriamo che tu possa capisci cosa intendo
Grazie.
Le armi non si equipaggiano. Il 'Person' dovrebbe avere il metodo' Equip'. Indipendentemente da ciò, una classe astratta, anche se non è possibile istanziarla direttamente, rappresenta dopotutto un oggetto - da cui "questo". – SimpleVar
Giusto per chiarire - quello che stai facendo qui è dire alla persona di equipaggiare un'arma, e la persona lo fa dicendo all'arma di equipaggiarsi su quella persona, e quindi l'arma si equipaggia effettivamente sulla persona. Questo è PingPong #. – SimpleVar
Forse questo aiuterà. Immaginiamo mentalmente che ogni metodo che usa "questo" sia ora un metodo * statico *. Ora aggiungi un parametro formale a quel metodo chiamato "_questo". Sostituisci mentalmente ogni "questo" con "_questo". Per le proprietà, immagina che siano metodi statici 'static int get_Color (Shape _this) {return _this.color; } 'e allo stesso modo per setter. In un mondo in cui ogni metodo è statico e nessuno usa "questo", hai qualche obiezione? Perché * è fondamentalmente come funziona *. "questo" è solo una convenzione secondo cui esiste un parametro formale nascosto. –