Supongamos que tengo dos clases que se ven así (el primer bloque de código y el problema general están relacionados con C #):
class A
{
public int IntProperty { get; set; }
}
class B
{
public int IntProperty { get; set; }
}
Estas clases no se pueden cambiar de ninguna manera (son parte de una asamblea de terceros). Por lo tanto, no puedo hacer que implementen la misma interfaz o hereden la misma clase que luego contendría IntProperty.
Quiero aplicar algo de lógica en la IntProperty
propiedad de ambas clases, y en C ++ podría usar una clase de plantilla para hacerlo con bastante facilidad:
template <class T>
class LogicToBeApplied
{
public:
void T CreateElement();
};
template <class T>
T LogicToBeApplied<T>::CreateElement()
{
T retVal;
retVal.IntProperty = 50;
return retVal;
}
Y luego podría hacer algo como esto:
LogicToBeApplied<ClassA> classALogic;
LogicToBeApplied<ClassB> classBLogic;
ClassA classAElement = classALogic.CreateElement();
ClassB classBElement = classBLogic.CreateElement();
De esa manera podría crear una única clase de fábrica genérica que funcionaría tanto para ClassA como para ClassB.
Sin embargo, en C #, tengo que escribir dos clases con dos where
cláusulas diferentes a pesar de que el código para la lógica es exactamente el mismo:
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;
}
}
Sé que si quiero tener diferentes clases en la where
cláusula, deben estar relacionadas, es decir, heredar la misma clase, si quiero aplicarles el mismo código en el sentido que describí anteriormente. Es solo que es muy molesto tener dos métodos completamente idénticos. Tampoco quiero usar la reflexión debido a los problemas de rendimiento.
¿Alguien puede sugerir algún enfoque en el que esto se pueda escribir de una manera más elegante?