Supposons que j'ai deux classes qui ressemblent à ceci (le premier bloc de code et le problème général sont liés à C #):
class A
{
public int IntProperty { get; set; }
}
class B
{
public int IntProperty { get; set; }
}
Ces classes ne peuvent en aucun cas être modifiées (elles font partie d'un assemblage tiers). Par conséquent, je ne peux pas leur faire implémenter la même interface ou hériter de la même classe qui contiendrait alors IntProperty.
Je veux appliquer une logique sur la IntProperty
propriété des deux classes, et en C ++, je pourrais utiliser une classe de modèle pour le faire assez facilement:
template <class T>
class LogicToBeApplied
{
public:
void T CreateElement();
};
template <class T>
T LogicToBeApplied<T>::CreateElement()
{
T retVal;
retVal.IntProperty = 50;
return retVal;
}
Et puis je pourrais faire quelque chose comme ça:
LogicToBeApplied<ClassA> classALogic;
LogicToBeApplied<ClassB> classBLogic;
ClassA classAElement = classALogic.CreateElement();
ClassB classBElement = classBLogic.CreateElement();
De cette façon, je pouvais créer une seule classe d'usine générique qui fonctionnerait à la fois pour ClassA et ClassB.
Cependant, en C #, je dois écrire deux classes avec deux where
clauses différentes même si le code de la logique est exactement le même:
public class LogicAToBeApplied<T> where T : ClassA, new()
{
public T CreateElement()
{
T retVal = new T();
retVal.IntProperty = 50;
return retVal;
}
}
public class LogicBToBeApplied<T> where T : ClassB, new()
{
public T CreateElement()
{
T retVal = new T();
retVal.IntProperty = 50;
return retVal;
}
}
Je sais que si je veux avoir différentes classes dans la where
clause, elles doivent être liées, c'est-à-dire hériter de la même classe, si je veux leur appliquer le même code dans le sens que j'ai décrit ci-dessus. C'est juste qu'il est très ennuyeux d'avoir deux méthodes complètement identiques. Je ne veux pas non plus utiliser la réflexion à cause des problèmes de performances.
Quelqu'un peut-il suggérer une approche où cela peut être écrit d'une manière plus élégante?