Припустимо, у мене є два класи, які виглядають приблизно так (перший блок коду та загальна проблема пов'язані з 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
пункті, вони повинні бути пов'язані, тобто успадковувати той самий клас, якщо я хочу застосувати до них той самий код у тому сенсі, який я описав вище. Просто дуже прикро мати два абсолютно однакових методу. Я також не хочу використовувати рефлексію через проблеми з продуктивністю.
Чи може хтось запропонувати якийсь підхід, де це можна написати більш елегантно?