Classe d'emballage générique
Compte tenu de la hiérarchie suivante:
class A
{
}
class B : A
{
public void Foo() { }
}
class C : A
{
public void Foo() { }
}
C'est une bibliothèque tierce, et je ne peux pas le modifier. Est-il possible que je peux écrire une sorte de "générique de type "modèle" wrapper " qui transmettrait les Foo() la méthode de l'winrar objet passé en argument du constructeur?
J'ai fini par écrire la suite, qui n'utilise pas de génériques et semble plutôt moche:
class Wrapper
{
A a;
public Wrapper(A a)
{
this.a = a;
}
public void Foo()
{
if (a is B) { (a as B).Foo(); }
if (a is C) { (a as C).Foo(); }
}
}
J'aimerais quelques modèles de contrainte comme Wrapper<T> where T : B or C
.
source d'informationauteur amnezjak
Vous devez vous connecter pour publier un commentaire.
Si
A
n'a pasFoo
vous devez soit utiliserdynamic
(voir Jon Skeet réponse) ou utiliser un petit truc avec les lambdas et la surcharge:Vous pouvez désormais le faire:
Cela décale la décision sur la méthode à appeler à partir du moment où le
Foo
est appelé au moment de laWrapper
est créé, potentiellement vous sauver quelques cycles CPU.Non, les deux
Foo
méthodes sont complètement étrangers autant que le compilateur est concerné. La façon la plus simple de le faire sans connaître les différents types pour commencer à utiliser typage dynamique:Génériques ne sera pas vous aider ici, aussi loin que je peux dire. Ce n'est pas comme il y a une interface (au moins aucun que vous avez montré que vous pouvez contraindre
T
.Vous pouvez passer dans un
Action
ainsi:qui le rend légèrement moins pratique pour l'appelant, mais très général...
Je suis réticent à le suggérer, mais que vous ne pouvez pas modifier la bibliothèque.. Si ce n'est pas la performance est critique, rappelons le
dynamic
mot-clé 🙂Edit: dans tous les autres cas, je serais personnellement utiliser les lambdas de même à ce dasblinkenlight a montré à obtenir au moment de la compilation de la vérification. Il peut être facilement généré automatiquement c'est à dire avec les feuillets T4 ou tout autre générateur de texte.
Vous pouvez créer une hiérarchie parallèle qui ne contiennent l'
Foo()
méthode au niveau de la racine.À l'aide de l'usine de méthodes que vous pouvez créer un Wrapper exemple pour chaque type. Pour que cela fonctionne, vous avez besoin de connaître le type exact de votre
A
exemple lorsque vous appelez la méthodeEdit: c'est essentiellement la même que cette réponse