Supponiamo di avere due classi simili a questa (il primo blocco di codice e il problema generale sono relativi a C #):
class A
{
public int IntProperty { get; set; }
}
class B
{
public int IntProperty { get; set; }
}
Queste classi non possono essere modificate in alcun modo (fanno parte di un gruppo di terze parti). Pertanto, non posso costringerli a implementare la stessa interfaccia o ereditare la stessa classe che conterrà quindi IntProperty.
Voglio applicare qualche logica sulla proprietà IntProperty
di entrambe le classi, e in C ++ potrei usare una classe template per farlo abbastanza facilmente:
template <class T>
class LogicToBeApplied
{
public:
void T CreateElement();
};
template <class T>
T LogicToBeApplied<T>::CreateElement()
{
T retVal;
retVal.IntProperty = 50;
return retVal;
}
E quindi potrei fare qualcosa di simile:
LogicToBeApplied<ClassA> classALogic;
LogicToBeApplied<ClassB> classBLogic;
ClassA classAElement = classALogic.CreateElement();
ClassB classBElement = classBLogic.CreateElement();
In questo modo ho potuto creare una singola classe generica factory che avrebbe funzionato sia per ClassA che per ClassB.
Tuttavia, in C #, devo scrivere due classi con due diverse clausole where
anche se il codice per la logica è esattamente lo stesso:
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;
}
}
So che se voglio avere classi diverse nella clausola where
, devono essere correlate, cioè ereditare la stessa classe, se voglio applicare lo stesso codice a loro nel senso che ho descritto sopra . È solo che è molto fastidioso avere due metodi completamente identici. Inoltre, non voglio utilizzare il reflection a causa dei problemi di prestazioni.
Qualcuno può suggerire un approccio in cui questo può essere scritto in modo più elegante?