Sto facendo una partita con i treni. Ho bisogno di serializzare quale treno è usato per ogni livello. Quindi posso semplicemente fare:
public class Level {
Track track;
Train train;
[...]
}
public class Train {
Wagon[] wagons;
}
public class Wagon {
float length;
float weight;
}
//Example:
level = new Level (track, new Wagon (1f,2f));
Ma poi, ho bisogno di avere tipi di Carri da cui posso scegliere. Mi piace così:
public class Wagon {
float length;
float weight;
public static Wagon Small { get { return new Wagon (1f,2f); }}
public static Wagon Big { get { return new Wagon (10f,20f); }}
}
//Example:
level = new Level (track, Wagon.Small);
Funziona. Ma se voglio modificare un parametro del vagone, devo deserializzare, modificare e riserializzare ogni Wagon.
Quindi mi sono inventato questo:
public enum WagonType {
Small,
Big
}
public class WagonParams {
float length;
float weight;
}
public class Wagon {
WagonType type;
WagonParams params { get { return WagonFactory.GetParams(type); }}
}
public WagonFactory {
static WagonParams small;
static WagonParams big;
static WagonFactory () {
small = new WagonParams (1f,2f);
big = new WagonParams (10f,20f);
}
public static WagonParams GetParams (WagonType type) {
switch (type) {
case WagonType.Small: return small;
case WagonType.Big: return big;
}
}
}
//Example:
level = new Level (track, new Wagon(WagonType.Small));
che sembra un po 'eccessivo, ma funziona.
Ora dì che voglio un SmallWagon ma con più peso, posso fare:
public interface IOverrideWagonField {
WagonParams Override (WagonParams params);
}
public class OverrideWeight : IOverrideWagonField {
float weight;
WagonParams Override (WagonParams params) {
return new WagonParams (params.length, weight);
}
}
public class Wagon {
WagonType type;
IOverrideField overrider;
WagonParams params { get { return WagonFactory.GetParams(type,overrider); }}
}
public WagonFactory {
static WagonParams small;
static WagonParams big;
static WagonFactory () {
small = new WagonParams (1f,2f);
big = new WagonParams (10f,20f);
}
public static WagonParams GetParams (WagonType type, IOverrideWagonField overrider) {
switch (type) {
case WagonType.Small: return overrider != null? overrider.Override(small) : small;
case WagonType.Big: return overrider != null? overrider.Override(big) : big;
}
}
}
//Example:
level = new Level(track, new Wagon(WagonType.Small,null)); //Normal Wagon
level = new Level(track, new Wagon(WagonType.Small,new OverrideWeight (23f)); //Override weight
Ciò che mi infastidisce (oltre alla complessità) è che ogni vagone usa la memoria per un IOverrideWagonField che potrebbero non usare.
Il sistema non funziona se si desidera eseguire l'override di più campi. Avrebbe bisogno di un array di IOverrideWagonField, ma creerebbe un nuovo oggetto per ogni campo di overross. (Il metodo Override () chiama "nuovo")
Quindi ritengo che questo sistema sia tutt'altro che perfetto.
Che ne pensi? Come andresti ad implementare un sistema del genere?