Hier 2 des gars de notre équipe sont venus me voir avec un problème rare. Nous utilisons un composant tiers dans l'une de nos applications Winforms. Tout le code a déjà été écrit contre. Ils ont ensuite voulu incorporer un autre composant tiers, par le même fournisseur, dans notre application. À leur grande joie, ils ont constaté que le deuxième élément avait exactement les mêmes membres du public que le premier. Mais à leur grande consternation, les 2 composants ont des hiérarchies d'héritage complètement distinctes, et n'implémentent pas d'interfaces communes. Ça vous fait réfléchir ... Eh bien, je me demande.Comment rendre 2 types incompatibles, mais avec les mêmes membres, interchangeables?
Un exemple du problème:
Incompatible Types http://www.freeimagehosting.net/uploads/f9f6b862f1.png
public class ThirdPartyClass1
{
public string Name
{
get
{
return "ThirdPartyClass1";
}
}
public void DoThirdPartyStuff()
{
Console.WriteLine ("ThirdPartyClass1 is doing its thing.");
}
}
public class ThirdPartyClass2
{
public string Name
{
get
{
return "ThirdPartyClass2";
}
}
public void DoThirdPartyStuff()
{
Console.WriteLine ("ThirdPartyClass2 is doing its thing.");
}
}
Volontiers ils se sentaient copier et coller le code qu'ils ont écrit pour le premier composant n'était pas la bonne réponse. Ils ont donc pensé à affecter le composant instantané à une référence d'objet, puis à modifier le code pour effectuer des conversions conditionnelles après avoir vérifié de quel type il s'agissait. Mais c'est sans doute encore plus laide que l'approche copier-coller.
Alors ils m'ont demandé si je pouvais écrire du code de réflexion pour accéder aux propriétés et appeler les méthodes des deux types d'objets différents puisque nous savons ce qu'ils sont, et ils sont exactement les mêmes. Mais ma première pensée a été que ça va l'élégance. Je pense qu'il doit y avoir une meilleure solution gracieuse à ce problème.
Sons comme vous voulez pour utiliser le modèle d'adaptateur: http://en.wikipedia.org/wiki/Adapter_pattern –