2013-05-26 15 views
7

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.

+1

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

+0

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

+1

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. –

risposta

5

I vincoli di linguaggio indicano che non è possibile creare direttamente una classe astratta, tuttavia è del tutto possibile avere un'istanza di essa - è sufficiente creare un'istanza di una classe derivata e quindi rilasciarla nella classe astratta.Una classe astratta può anche avere implementazione in esso, quindi l'uso della parola chiave this è perfettamente normale e accettabile.

0

Dai un'occhiata a questo Microsoft on Abstract Keyword. Ha lo scopo di funzionare in questo modo. Solo perché l'oggetto stesso non può essere istanziato non significa che non verrà mai istanziato. Di fatto il tuo ha garantito che abbia una classe di implementazione prima che tu possa raggiungere la parola chiave this nel tuo codice. Quindi è sicuro. (Quando si richiede un Weapon dall'elenco Item, che Weapon doveva essere già stata creata un'istanza nel codice. Presumibilmente ad un Swords o simili. In caso contrario, si potrebbe mai accedervi per memorizzarlo nella lista e così via)

Infine noterò che il modo in cui si utilizza la classe Weapon può essere leggermente confuso. Quindi una breve analogia sul punto. Pensaci in questo modo. Solo perché il pensiero, far oscillare un'arma, significa nulla senza un'arma effettiva in mano, non significa che se si tiene in mano un'arma; non può riferirsi a quell'arma.

Spero che ora sia un po 'più chiaro.

Problemi correlati