Generisches Problem

17/11/2008 - 19:04 von Armin Zingler | Report spam
Hallo miteinander,

ich habe z.Zt. einige Problem mit generischen Klassen, die ich einfach nicht
gelöst bekomme. Ich versuche mal, die Praxis vereinfacht darzustellen. Mehr
Infos bei Bedarf.

Zunàchst habe ich eine generische Klasse C1(Of T). Ich wollte nun in einer
List(Of) Instanzen davon speichern. Wie deklariere ich diese? "Dim liste as
New List(of C1)" funktioniert ja nicht. Ich müsste schreiben "Dim liste as
new list(of C1(Of XYZ))" wobei ich XYZ ja nicht angeben kann, denn es sollen
in der Liste sowohl C1(Of Point)- als auch C1(Of Rectangle)-Objekte
gespeichert werden können. Mir ist schon klar, dass das so nicht
funktionieren kann! Somit bleibt mir als Elementtyp der Liste nur eine
nicht-generische Basisklasse von C1 (zur Not System.object) oder ein
nicht-generisches, implementiertes Interface. So habe ich es auch gemacht:
C1 implementiert Interface I1. Die Liste ist somit eine List(Of I1).

Zusàtzlich habe ich eine generische Klasse C2(Of T). Eine Methode lautet
"Sub Add(byval arg As C1(Of T))".

An irgendeiner Stelle X im Programm verarbeite ich eine List(Of I1).
Ergebnis der Verarbeitung soll eine variable Anzahl von C2-Objekten sein.
Genau das ist das Problem! Um C2-Objekte zu /deklarieren/ (=Entwurfszeit),
muss ich einen konkreten Typ angeben, aber den kenne ich ja noch gar nicht.
Es entscheidet sich erst zur Laufzeit, welche konkreten Parametertypen
vorzufinden sind. Noch dazu müssen die noch nicht einmal vom Typ C1(Of T)
sein, sondern es könnte auch jedes andere Objekt sein, das I1 implementiert.

Beispiel:

List(Of I1) enthàlt: (Input der Verarbeitung)
- C1(Of Point)
- C1(Of Rectangle)
- C1(Of Rectangle)
- C1(Of bla)

Funktion soll diese Liste zurückgeben:
- C2(Of Point)
- C2(Of Rectangle)
- C2(Of bla)

Ich weiß momentan überhaupt nicht, wie das, zumindest ohne Reflection,
funktionieren kann. Momentan mache ich pro Item in der Liste einen Select
Case bei dem ich konkret die Typen C1(Of Point) und C1(Of Rectangle)
berücksichtige und für alle anderen Typen eine Exception werfe. Entsprechend
habe ich konkret zwei Variablen mit Typ C2(Of Point) und C2(Of Rectangle)
deklariert. Als endgültige Lösung kann ich das aber (noch) nicht
akzeptieren.

Würde mich über Eingebungen freuen. :-)


Armin
 

Lesen sie die antworten

#1 Armin Zingler
18/11/2008 - 10:14 | Warnen spam
Hallo nochmal,

man könnte das ganze bla bla auch vereinfachen und sagen:

dim o as object

Abhàngig vom Typ der Instanz, auf die o verweist, soll zur Laufzeit eine
List(Of [Typ von o]) erzeugt werden. Das geht, ohne Reflection, eben einfach
nicht. Verstehe ich ja auch.

Trotzdem, eine Lösung habe ich noch nicht gefunden weil ich den Knackpunkt,
meinen Denkfehler nicht finde. :-( Ich kann nàmlich den generischen Klasse
nicht zu einer nicht-generischen Klasse umschreiben, weil ich dann statt des
Typs "T" den Typ System.Object verwenden müsste. Das darf aber nicht sein,
weil es dann jedesmal ein anderer Typ sein könnte. Das wàre àhnlich, wie
eine Arraylist statt einer List(Of) zu verwenden. Wenn die Forderung
besteht, dass nur immer derselbe Typ zur Arraylist hinzugefügt werden darf,
dann liesse sich das immer erst zur Laufzeit prüfen, und ggf muss eine
Exception geworfen werden. Mit dem generischen Typ besteht /das/ Problem
zwar nicht, aber eben das oben erwàhnte. Ick drehe mir irjendwie im Kreis.
:-(


Armin

Ähnliche fragen