Generische Klasse bei dynamischer Erzeugung verwenden

05/02/2009 - 08:21 von Andreas | Report spam
Hallo,

ich habe mal eine komplizierte Frage zu Generics. In meiner Anwendung
muss ich verschiedene Controls erstellen, die alle von einer
Basisklasse erben. Die Erstellung findet in einer statischen Methode
statt (kleine Factory). Da ich in den Controls immer ein bestimmtes
Element benötige, welches aber von unterschiedlicher Art ist, wollte
ich die Klasse mittels Generics so erweitern, dass ich den typ bei der
Initialisierung übergeben kann.

Nun mal etwas Code:

Basisklasse BC soll erweiter werden, so dass es so aussieht. (V - typ
für das Datenobjekt)
public BC<V>
{
}

In der statischen Methode in BC, die die Initialisierung des konkreten
Controls vornimmt sieht es so aus:
public static BC CreateControl<T>(string caption, MainWnd container)
where T : BC, new()
{
UserControlBase control;
try
{
control = new T();
control.Container = container;
control.Caption = caption;
}
catch (Exception ex)
{
}
return control;
}

Und hier sollte ich folgendes machen.

public static BC CreateControl<T,V>(string caption, MainWnd
container) //weiteren Typ
where T : BC, new()
{
UserControlBase control;
try
{
control = new T<V>(); //<- Typ für BC
control.Container = container;
control.Caption = caption;
}
catch (Exception ex)
{
}
return control;
}

Leider geht kann ich das so nicht machen. Der Compiler meckert,
wahrscheinlich auch zurecht. Gibt es denn eine Möglichkeit, das so
umzusetzen?

Andreas
 

Lesen sie die antworten

#1 Stefan L
05/02/2009 - 15:53 | Warnen spam
Hallo Andreas,

ich finde das Konstrukt auf jeden Fall abenteuerlich. Kann aber auch
daran liegen, dass ich nicht zu 100% verstanden habe, wie du es
einsetzen willst.

Nun ja, auf jeden Fall ist es möglich, dass so zu machen, Code sieht so aus:

public static T CreateControl<T,V>(string caption, MainWnd container)
where T : BC<V>, new()
{
UserControlBase control;
try
{
control = new T(); //<- Typ für BC [wird nicht benötigt, steckt
schon in T drin!]
control.Container = container;
control.Caption = caption;
}
catch (Exception ex)
{
}
return control;
}

Die Typinformation V für BC<V> steckt dabei schon implizit in T drin.
Wenn du deine Klasse T auch generisch von der Klasse V ableitest (also
nicht class TClass : BV<V> sondern class TClass<V> : BC<V>) dann wàre
der Typ T = TClass<V> in deinem Beispiel, auf diese Weise steckt V immer
implizit schon in T drin.

Hoffe, das hilft dir weiter.


Gruss,
Stefan



Andreas schrieb:
Hallo,

ich habe mal eine komplizierte Frage zu Generics. In meiner Anwendung
muss ich verschiedene Controls erstellen, die alle von einer
Basisklasse erben. Die Erstellung findet in einer statischen Methode
statt (kleine Factory). Da ich in den Controls immer ein bestimmtes
Element benötige, welches aber von unterschiedlicher Art ist, wollte
ich die Klasse mittels Generics so erweitern, dass ich den typ bei der
Initialisierung übergeben kann.

Nun mal etwas Code:

Basisklasse BC soll erweiter werden, so dass es so aussieht. (V - typ
für das Datenobjekt)
public BC<V>
{
}

In der statischen Methode in BC, die die Initialisierung des konkreten
Controls vornimmt sieht es so aus:
public static BC CreateControl<T>(string caption, MainWnd container)
where T : BC, new()
{
UserControlBase control;
try
{
control = new T();
control.Container = container;
control.Caption = caption;
}
catch (Exception ex)
{
}
return control;
}

Und hier sollte ich folgendes machen.

public static BC CreateControl<T,V>(string caption, MainWnd
container) //weiteren Typ
where T : BC, new()
{
UserControlBase control;
try
{
control = new T<V>(); //<- Typ für BC
control.Container = container;
control.Caption = caption;
}
catch (Exception ex)
{
}
return control;
}

Leider geht kann ich das so nicht machen. Der Compiler meckert,
wahrscheinlich auch zurecht. Gibt es denn eine Möglichkeit, das so
umzusetzen?

Andreas

Ähnliche fragen