Ho materiali del mondo reale che sono definiti da varie proprietà, alcune comuni, altre no, che mi piacerebbe mappare agli oggetti in C #. Ad esempio, Concrete
ha proprietà A
, B
, C
e Metal
ha proprietà A
, B
, D
, E
.
Questo sembra un caso da manuale per l'ereditarietà della classe:
class Material
{
public double A { get; set; }
public double B { get; set; }
}
class Concrete : Material
{
public double C { get; set; }
}
class Metal : Material
{
public double D { get; set; }
public double E { get; set; }
}
Questo potrebbe funzionare per il momento, tuttavia, tenendo presente la manutenibilità del codice, posso pensare ad alcuni avvertimenti: il codice esegue calcoli secondo uno standard dato, ma nel gioco finale, dovrebbe essere adattabile ad altri standard, che può richiedere proprietà diverse all'oggetto, o addirittura modificare la caratterizzazione dell'oggetto (classi derivate). Questo porterebbe a qualcosa di simile:
class Material
{
public double A;
public double B;
}
class Concrete : Material
{
public double C;
}
class Metal : Material
{
public double D;
public double E;
}
class Concrete_US : Material
{
...
}
class Metal_US : Material
{
...
}
class Concrete_Europe : Concrete
{
...
}
class Steel_Europe : Metal
{
...
}
class Copper_Europe : Metal
{
...
}
Bene, questo sta iniziando a diventare disordinato. Ma peggio ancora, un dato materiale può benissimo essere completamente caratterizzato su più standard, quindi un oggetto potrebbe dover essere un'istanza di più classi.
Quindi attualmente sto usando un altro approccio, che è quello di avere un Properties
dictionnary, associando stringhe ai valori in una singola classe Material
. In questo modo, il supporto di un nuovo tipo di materiale e / o di uno standard è solo una questione di aggiungere voci di dizionario. Tuttavia, questo si sente soggetto a errori, con rischi di collisioni e errori di battitura (anche la manipolazione delle stringhe è inefficiente, ma non ci sono molti accessi al dizionario).
C'è un modo migliore per farlo?