Supponiamo di avere due classi che assomigliano a questo (il primo blocco di codice e il problema generale sono correlati 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 assembly di terze parti). Pertanto, non riesco a farli implementare la stessa interfaccia o ereditare la stessa classe che conterrebbe quindi IntProperty.
Voglio applicare una logica sulla IntProperty
proprietà 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 poi potrei fare qualcosa del genere:
LogicToBeApplied<ClassA> classALogic;
LogicToBeApplied<ClassB> classBLogic;
ClassA classAElement = classALogic.CreateElement();
ClassB classBElement = classBLogic.CreateElement();
In questo modo ho potuto creare un'unica classe di fabbrica generica che avrebbe funzionato sia per ClassA che per ClassB.
Tuttavia, in C #, devo scrivere due classi con due diverse where
clausole 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 diverse classi nella where
clausola, devono essere correlate, cioè ereditare la stessa classe, se voglio applicare loro lo stesso codice nel senso che ho descritto sopra. È solo che è molto fastidioso avere due metodi completamente identici. Inoltre, non voglio usare la riflessione a causa di problemi di prestazioni.
Qualcuno può suggerire un approccio in cui questo può essere scritto in un modo più elegante?