10
votes

Classe d'emballage générique

Compte tenu de la hiérarchie suivante: xxx

Il s'agit d'une bibliothèque tierce partie et je ne peux pas la modifier. Existe-t-il une façon d'écrire une sorte de «wrapper modélisé générique» qui transmettrait la méthode FOO () à l'objet Aproprise passée comme argument de constructeur? J'ai fini par écrire ce qui suit, qui n'utilise pas de génériques et semble plutôt laid: xxx

J'adorerais une contrainte de modèle comme Wrapper Où T: B ou c .


1 commentaires

Je suppose que le problème principal est que foo n'est pas virtuel dans A , non?


4 Réponses :


8
votes

Non, les deux FOO sont entièrement indépendants en ce qui concerne le compilateur. Le moyen le plus simple de faire cela sans connaître les types individuels à commencer serait d'utiliser la dactylographie dynamique: xxx

génériques ne vous aidera pas ici, aussi loin comme je peux dire. Ce n'est pas comme s'il y a une interface (au moins aucun que vous avez montré) que vous pouvez contraindre t à.

Vous pouvez passer dans un action De plus: xxx

ce qui le rend légèrement moins pratique pour l'appelant, mais très général ...


2 commentaires

C'est un pakeet Paunch. vous rock skeet.


Fusionner «Action de passage» de Jon avec la suggestion de Dasblinkenlight et un modèle T4 et vous devriez obtenir une solution très raisonnable et maintenable.



15
votes

Si A code> n'a pas foo code>, vous devez soit utiliser dynamique code> (voir La réponse de Jon Skeet ) ou utilisez un peu de truc avec Lambdas et surcharge:

var wb = new Wrapper(new B());
wb.Foo(); // Call B's Foo()
var wc = new Wrapper(new C());
wc.Foo(); // Call C's Foo()


1 commentaires

Merci à tous! Je pense que je vais chercher votre solution car il y a plus de fonctions de type FOO, que j'ai omis pour la brièveté. Je dois également utiliser l'emballage plusieurs fois sur mon code et dynamique semble trop en ligne.



0
votes

Je suis réticent à le suggérer, mais comme vous ne pouvez pas modifier la bibliothèque. Si ce n'est pas critique de performance, rappelez-vous le mot-clé dynamique :) xxx

Edit: dans tous les autres cas, personnellement je l'utilise lambdas similaire à ce qui dasblinkenlight a montré - pour obtenir le contrôle de la compilation. Il peut être facilement autogenréé, c'est-à-dire avec T4S ou tout autre générateur de texte.


0 commentaires

0
votes

Vous pouvez créer une hiérarchie parallèle qui contient la méthode foo () au niveau de la racine.
Utilisation des méthodes d'usine Vous pouvez créer une instance d'emballage pour l'un ou l'autre type. Pour que cela fonctionne, vous devez connaître le type exact de votre instance lorsque vous appelez la méthode d'usine xxx

édition: ceci est essentiellement la même chose que Cette réponse


0 commentaires