2016-03-18 28 views
5

Attualmente sto lavorando su un gioco in XNA e io non sono sicuro di come dovrei andare a fare la seguente ...C# sottoclasse Best Practice

ho una classe di base degli edifici in quanto tale

public class BuildingsBase 
    { 
    private int _hp; 
    public int hp 
    { 
     get { return _hp; } 
     set { _hp= value; } 
    } 

    private int _woodRequired; 
    public int woodRequired 
    { 
     get { return _woodRequired; } 
     set { _woodRequired = value; } 
    } 
    } 

Ho quindi più sottoclassi per i tipi di costruzione ad es.

public class TownHall:BuildingsBase 
{ 
    public int foodHeld; 

    public TownHall() 
    { 
     foodHeld = 100; 
     woodRequired = 500; 
    } 
} 

La mia domanda è, qual è il modo migliore per impostare i valori predefiniti per la costruzione di sottoclassi.

Ad esempio, il legname richiesto per un townhall è impostato su 500 ma in vari punti del codice è necessario accedere a questo valore prima di avere un'istanza di townhall dichiarata (quando si verifica se c'è abbastanza legno da costruire).

Attualmente ho una serie globale di variabili predefinite per ogni tipo di edificio, ma mi chiedo se c'è un modo migliore per farlo.

if (Globals.buildingDefaults[BuildingType.Townhall].woodRequired < Globals.currentWood) 
{ 
    Townhall newTH = new Townhall(); 
} 
+1

Perché il downvote? Penso che sia una domanda valida. – Caramiriel

+1

Perché non fare il contrario? Prima build ad es. TownHall interno e poi controlla il valore di 'WoodRequired <= myCurrentWood' se non è disponibile una quantità sufficiente di legno basta distruggere nuovamente l'oggetto. Beh, questo non dovrebbe essere fatto se hai un oggetto enorme con un sacco di calcoli, ovviamente. L'utente non sa di avere già l'oggetto e chiama semplicemente .Show() o qualcosa del genere. –

+0

La seconda idea è implementare una funzione 'int currentWood()' e basta controllarla nel costruttore degli oggetti, lì puoi fermare la creazione se non è disponibile abbastanza legno –

risposta

4

Di solito quello che succede è che essi creano un peso mosca (see pattern). Questo oggetto contiene comunque proprietà uguali per ogni istanza. Non è necessario modificare (o memorizzare effettivamente) la quantità di legno richiesta separatamente per ciascuna istanza.

In un design molto semplice che sarebbe simile:

class BuildingTemplate 
{ 
    public int WoodRequired { get; set; } 
} 

class Templates 
{ 
    public static BuildingTemplate TownHall { get; set; } 
} 

Alla fine si sarebbe chiamando un metodo come:

public bool CanBuildTownHall(Player player) 
{ 
    return player.HasEnoughResources(Templates.TownHall); 
} 

Naturalmente, è possibile utilizzare un dizionario per il modello recupero, e i giocatori non dovrebbero conoscere i requisiti di costruzione. Sto solo illustrando lo schema qui.

Se il giocatore dispone di risorse sufficienti, è possibile utilizzare il modello per sottrarre l'importo e creare un'istanza effettiva dello TownHall. È utile avere un riferimento al modello attuale, perché probabilmente accederai ad altre proprietà globali valide per tutti gli TownHall s (come audio/immagini/...).

class TownHall 
{ 
    public TownHall(BuildingTemplate template) 
    { 
     _template = template; 
    } 
} 
+0

Grazie per questo, molto utile, sembra un metodo abbastanza simile a un array globale ma con meno overhead. – user3208483