Nehmen wir an, ich habe ein Datenobjekt, aber dieses Objekt kann einen von mehreren Arten von Daten enthalten.Der beste Weg, um ein Objekt vom Typ Multi zu entwerfen
class Foo
{
int intFoo;
double doubleFoo;
string stringFoo;
}
Jetzt will ich einen Accessor erstellen. Ein Weg, um an diese Daten zu kommen. Natürlich könnte ich mehrere Accessoren erstellen:
public int GetIntFoo();
public double GetDoubleFoo();
public string GetStringFoo();
Oder ich könnte mehrere Eigenschaften
public int IntFoo { get; set; }
public double DoubleFoo { get; set; }
public string StringFoo { get; set; }
Ich mache nicht, dass dies ein sehr gutes Design. Es erfordert, dass der Client-Code sich mehr um den Typ kümmert, als er sein sollte. Außerdem benötige ich wirklich nur einen einzigen Wert für diese Klasse und das oben genannte würde erlauben, dass jeder Typ gleichzeitig zugewiesen wird. Nicht gut.
Eine Option ist die Verwendung von Generika.
class Foo<T>
{
public T TheFoo { get; set; }
}
Dies ist jedoch nicht eine Foo schafft, schafft es ein Foo <T>. Ein anderer Typ für jeden, so dass ich sie nicht wirklich als denselben Typ verwenden kann.
Ich könnte Foo <T> von FooBase ableiten, dann behandeln sie alle als FooBase, aber dann bin ich zurück in das Problem des Zugriffs auf die Daten.
Eine andere Generics Option ist, so etwas zu verwenden:
class Foo
{
string stringRepresentationOfFoo;
public T GetFoo<T>() { return /* code to convert string to type */ }
}
Natürlich ist das Problem ist, dass jede Art von T weitergegeben werden kann, und ehrlich gesagt, ist es ein bisschen beschäftigt.
Ich könnte auch nur die Werte boxen und ein Objekt zurückgeben, aber dann gibt es keine Art Sicherheit.
Idealerweise möchte ich alle Foo's gleich behandeln, aber ich möchte Sicherheit geben, damit ich, wenn es kein StringFoo gibt, nicht einmal einen Verweis auf einen StringFoo kompilieren kann.
Vielleicht ist das gar nicht möglich .. und ich muss Kompromisse machen, aber vielleicht fehlt mir etwas.
Irgendwelche Ideen?
EDIT:
Ok, so wie Daniel weist darauf hin, die Kompilierung einer Laufzeit-Typprüfung nicht praktikabel ist.
Was ist meine beste Option, um das zu tun, was ich hier machen möchte? Nämlich, Behandle alle Foo's gleich, aber immer noch einen relativ vernünftigen Zugriffsmechanismus?
EDIT2:
Ich will nicht den Wert auf verschiedene Arten konvertieren. Ich möchte den korrekten Typ für den Wert zurückgeben. Das heißt, wenn es ein Double ist, möchte ich kein int zurückgeben.
Wenn Ihre Instanz von Foo ein beliebiger Wert sein kann, woher weiß Ihr Verbraucher dann, in welcher Art von Variable er das Ergebnis speichern soll? –
Habe ich recht, wenn ich denke, dass Sie versuchen, sich in C# (einer stark typisierten Sprache) wie eine locker geschriebene Sprache zu verhalten? –
Nein, Sie sind nicht korrekt. Ich versuche, stark zu tippen. Das ist der ganze Punkt, sonst würde ich nur Objekte und Cast verwenden. –