Sovrascrittura del campo statico

Sto scrivendo un motore di gioco C # per il mio gioco e ho riscontrato un problema.

Ho bisogno di fare una XNA.Rectangle drawRectangle per ogni diverso tipo di blocco.

I blocchi sono memorizzati in un elenco di blocchi, quindi la proprietà, per essere accessibile disegnando senza lanciare molto, deve essere sostituita.

Ho provato molti modi per farlo, ma nessuno funziona.

Ecco quello che sto facendo:

Block.cs

protected static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32); public Rectangle drawRectangle { get { return m_drawRectangle; } } 

BlockX.cs

 protected static Rectangle m_drawRectangle = new Rectangle(32, 0, 32, 32); 

Tuttavia, durante la creazione di BlockX e l’accesso a drawRectangle , restituisce ancora 0, 0, 32, 32.

Idealmente, potrei semplicemente ignorare il membro drawRectangle , tuttavia fare ciò significherebbe creare un membro in ogni class di blocchi. Voglio solo regolare m_drawRectangle.

Ogni blocco verrà creato centinaia di volte quindi non voglio che sia non statico, e sarebbe stupido farlo nel costruttore.

C’è un modo migliore oltre a mettere una funzione statica per inizializzare le cose statiche in ogni blocco?

Modificare:

Quindi, per riassumere, i miei requisiti sono:

  • Minimo codice aggiuntivo in BlockX.cs da sovrascrivere
  • Il campo deve rimanere statico
  • Preferibilmente non è necessario sovrascrivere drawRectangle , solo m_drawRectangle .
  • Non è necessario creare un nuovo rettangolo ogni volta che si accede alla proprietà

I membri di Statics non sono chiamati polimorficamente – è così semplice. Nota che parli della proprietà statica – al momento non hai una proprietà statica. Hai una proprietà di istanza e due campi statici.

Un paio di opzioni:

  • Un membro virtuale che viene sovrascritto in ogni class, anche se non ha bisogno di uno stato dall’object diverso dal suo tipo
  • Passa il rettangolo per disegnare nel costruttore del blocco e memorizzarlo in un campo

Non è necessario sovrascrivere drawRectangle in ogni class se si utilizza la parola chiave virtuale.

Block.cs

 protected static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32); public virtual Rectangle drawRectangle { get { return m_drawRectangle; } } 

BlockX.cs

 private static Rectangle m_drawRectangleX = new Rectangle(32, 0, 32, 32); public override Rectangle drawRectangle { get { return m_drawRectangleX; } } 

Non è ansible ignorare un membro statico.

Mi rendo conto che non vuoi sovrascrivere drawRectangle, ma quella sembra essere la soluzione più semplice da implementare dato ciò che hai nella tua domanda. La soluzione migliore è dichiarare un nuovo campo statico in ogni class derivata e sostituire la proprietà dell’istanza per ottenere i risultati desiderati:

 public class Block { private static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32); public virtual Rectangle drawRectangle { get { return m_drawRectangle; } } } public class BlockX : Block { private static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32); public override Rectangle drawRectangle { get { return m_drawRectangle; } } } 

Come altri hanno detto che non è ansible ignorare un membro statico, ma mi piacerebbe improvvisare sulla risposta tenendo in considerazione eventuali problemi che potrebbero sorgere durante la creazione di membri statici o a causa del riciclo del pool di applicazioni o eventi simili.

 public class Block { private static Rectangle m_drawRectangle; public virtual Rectangle drawRectangle { get { if(m_drawRectangle == null) m_drawRectangle = new Rectangle(0, 0, 32, 32); return m_drawRectangle; } } } public class BlockX : Block { private static Rectangle m_drawRectangle = new Rectangle(0, 0, 32, 32); public override Rectangle drawRectangle { get { if(m_drawRectangle == null) m_drawRectangle = new Rectangle(0, 0, 32, 32); return m_drawRectangle; } } }