Sto codificando un gioco e ho un problema di progettazione in cui ho una superclasse da cui ereditano tutti gli elementi del gioco. Il gioco è basato sulla griglia e gli oggetti possono essere posizionati in diverse parti della griglia. La griglia ha un dizionario di posizioni di griglia - > BASEITEM.
Il problema è che gli oggetti derivati fanno cose molto diverse. Quindi devo sempre downcast per ottenere i comportamenti specifici che voglio quando recupero roba dalla griglia. Ecco un semplice esempio:
public abstract class BaseObj {
public string Name {get; set;}
public int Hitpoints {get; set;}
}
public class Turret : BaseObj {
public void FireWeapon() { }
public int Damage {get; set;}
}
public class ProductionBuilding: BaseObj {
public void CraftItem(BaseObj item) {}
public float CraftSpeed {get; set;}
}
Quindi uno scenario è dove il giocatore sta selezionando un oggetto dalla griglia. La classe della griglia ha un metodo che restituisce l'oggetto situato alle coordinate del mouse quando si fa clic.
Da qui, ho bisogno di determinare che tipo di cosa il giocatore ha selezionato. Determina quali pannelli dell'interfaccia utente mostro e quali comportamenti posso fare sugli elementi. Di conseguenza la mia base di codice è piena di downcasts e typechecks. Ci deve essere un modello di progettazione che si occupa di strutture ereditarie moderatamente complesse e downcasting. Qualche idea?
Sto codificando in C # e Unity, ma immagino che la risposta sarà abbastanza generale da comprendere OOP in generale.
Questo non è un duplicato di: Come evitare il downcast continuo in questo caso?
In quel caso, l'oggetto contenitore ospitava solo un cane, quindi applicare un tipo di modello a DogHouse era abbastanza facile. Ma questa soluzione non può essere applicata alla mia griglia, poiché contiene un elenco di elementi.
EDIT:
Come richiesto, ecco un esempio di dove sto lanciando. Il contesto di questo è il giocatore sta mettendo giù un oggetto sulla griglia.
if (typeof(StationModule) == item.GetType())
{
StationManager.HandleModuleAdded((StationModule)item);
}
Il StationManager fa qualcosa di speciale quando sono posizionati StationModule, ma il giocatore può mettere altre cose oltre a StationModule sulla griglia, nel qual caso StationManager non gli interessa.