У меня есть много классов данных, которые совместно используют абстрактный базовый класс, таким образом, я могу работать с ними в общем (вид). У каждого из них есть статический метод под названием Lerp, который я часто использую наряду с несколькими другими строками. Я хотел осуществить рефакторинг это в метод из-за DRY, но кажется, что нет никакого способа сделать так. Как я обхожу это?
Может предоставить код, если необходимо.
Код - в основном это:
XmlNode mineDataMin = mineDataMaster.SelectSingleNode("DataMinimum");
XmlNode mineDataMax = mineDataMaster.SelectSingleNode("DataMaximum");
_mineTemplate = MineInfo.Lerp(
new MineInfo(mineDataMin),
new MineInfo(mineDataMax),
_strength);
где класс, MineInfo может быть одним из нескольких классов, которые весь совместно используют абстрактный класс, который используется для способности иметь дело с любым из них в общем. Lerp является статическим методом, который является источником проблемы.
Один из способов сделать это - использовать делегирование для вашей функции Lerp ()
. Было бы проще, если бы все они имели одну и ту же подпись.
например,
public static Template CreateTemplate<T>( ... , Func<T, T, int, Template> lerp)
where T : CommonClass
{
XmlNode mineDataMin = mineDataMaster.SelectSingleNode("DataMinimum");
XmlNode mineDataMax = mineDataMaster.SelectSingleNode("DataMaximum");
return lerp(new T(mineDataMin), new T(mineDataMax), _strength);
}
_template = CreateTemplate( ... , MineInfo.Lerp);
Или, если у них нет общей подписи, используйте делегат с «наибольшим общим знаменателем» для подписи, чтобы вызвать фактическую функцию lerp.
_template = CreateTemplate( ... ,
(min, max, strength) =>
{
return SomeOtherInfoInfo.Lerp(min, max); //doesn't use strength
});
Иначе всегда есть отражение.