Давайте предположим, что у меня есть два класса, которые выглядят так (первый блок кода и общая проблема связаны с C #):
class A
{
public int IntProperty { get; set; }
}
class B
{
public int IntProperty { get; set; }
}
Эти классы не могут быть изменены каким-либо образом (они являются частью сторонней сборки). Поэтому я не могу заставить их реализовывать один и тот же интерфейс или наследовать тот же класс, который затем будет содержать IntProperty.
Я хочу применить некоторую логику к IntProperty
свойствам обоих классов, и в C ++ я мог бы использовать шаблонный класс, чтобы сделать это довольно легко:
template <class T>
class LogicToBeApplied
{
public:
void T CreateElement();
};
template <class T>
T LogicToBeApplied<T>::CreateElement()
{
T retVal;
retVal.IntProperty = 50;
return retVal;
}
И тогда я мог бы сделать что-то вроде этого:
LogicToBeApplied<ClassA> classALogic;
LogicToBeApplied<ClassB> classBLogic;
ClassA classAElement = classALogic.CreateElement();
ClassB classBElement = classBLogic.CreateElement();
Таким образом, я мог бы создать один общий фабричный класс, который работал бы как для ClassA, так и для ClassB.
Однако в C # мне нужно написать два класса с двумя разными where
предложениями, хотя код для логики точно такой же:
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;
}
}
Я знаю, что если я хочу иметь разные классы в where
предложении, они должны быть связаны, то есть наследовать один и тот же класс, если я хочу применить к ним один и тот же код в том смысле, который я описал выше. Просто очень неприятно иметь два совершенно одинаковых метода. Я также не хочу использовать отражение из-за проблем с производительностью.
Может кто-нибудь предложить какой-нибудь подход, где это можно написать более элегантно?