Hi!
Wie gestalte ich am besten eine Methode (nennen wir sie mal getValue), um auf diese Werte zuzugreifen? Sie müßte ja quasi einen variablen Rückgabetyp haben.
Dann kommt im einfachsten Fall nur object als der Basistyp aller Typen in Frage plus Typecasts. Gleichnamige Methoden müssen sich (üblicherweise) in Gegebenheiten unterscheiden, die beim Anwenden eindeutig sind. Bei unterschiedlichen Rückgabetypen aber stets gleichem Rest ist das schwer möglich.
(1) Der Rückgabewert ist sowas wie Microsofts VARIANTs (aus COM), d.h. Typ und Wert werden gemeinsam gespeichert und man muß _nach_ Erhalt dieses Wertes prüfen, was man eigentlich bekommen hat.
Umständlich. Im Allgemeinen weiß man ja, was man für einen Typ erwartet, weil die nachfolgende Verarbeitung genau darauf abgestimmt ist. Im Grunde ist diese Variante auch nichts großartig anderes als einen Basistyp zurückzugeben und zu casten.
(2) Der Aufrufer _weiß_, was er haben will, bekommt von getValue nur sowas wie einen Null-Pointer in C und muß dann selber auf den entsprechenden Datentyp casten.
Null-Pointer? Du meinst einen Basistyp, unter C vielleicht einen untypisierten Pointer, weil es da keinen gemeinsamen Basistypen gibt, soweit ich das weiß. Ich kenne nur C#.
(3) Ähnlich wie (2), nur daß es für jeden Datentyp eine eigene Version von getValue gibt. Die Abfrage von optB könnte dann z.B. über eine Methode mit dem Prototyp
int getIntValue(string optName)
passieren.
Das ist der übliche herkömmliche Weg, so wie ich ihn kenne.
Gibt es denn für statisch typisierte Sprachen wie C oder Java noch andere, vielleicht _bessere_ Ansätze?
Wenn Generics zur Verfügung stehen, kann man zumindest die vielen Methoden in eine zusammenfassen, der man den gewünschten Typ mitgibt. Die dahinter steckende Arbeit bleibt die gleiche, nur dass man nicht mehr viele spezielle Methoden hat sondern nur noch eine, die viele Fälle bearbeiten muss (falls sie nicht weiterdelegiert).
getValue<T>(optionName)
Lo!