Eu tenho várias classes que todos herdam de uma classe base genérica. A classe base contém uma coleção de vários objetos do tipo T
.
Cada classe filho precisa ser capaz de calcular valores interpolados a partir da coleção de objetos, mas como as classes filho usam tipos diferentes, o cálculo varia um pouquinho de classe para classe.
Até agora, copiei / colei meu código de classe para classe e fiz pequenas modificações em cada uma. Mas agora estou tentando remover o código duplicado e substituí-lo por um método de interpolação genérico na minha classe base. No entanto, isso está se mostrando muito difícil, e todas as soluções que pensei parecem muito complexas.
Estou começando a pensar que o princípio DRY não se aplica tanto a esse tipo de situação, mas parece blasfêmia. Quanta complexidade é grande ao tentar remover a duplicação de código?
EDITAR:
A melhor solução que posso encontrar é mais ou menos assim:
Classe base:
protected T GetInterpolated(int frame)
{
var index = SortedFrames.BinarySearch(frame);
if (index >= 0)
return Data[index];
index = ~index;
if (index == 0)
return Data[index];
if (index >= Data.Count)
return Data[Data.Count - 1];
return GetInterpolatedItem(frame, Data[index - 1], Data[index]);
}
protected abstract T GetInterpolatedItem(int frame, T lower, T upper);
Classe infantil A:
public IGpsCoordinate GetInterpolatedCoord(int frame)
{
ReadData();
return GetInterpolated(frame);
}
protected override IGpsCoordinate GetInterpolatedItem(int frame, IGpsCoordinate lower, IGpsCoordinate upper)
{
double ratio = GetInterpolationRatio(frame, lower.Frame, upper.Frame);
var x = GetInterpolatedValue(lower.X, upper.X, ratio);
var y = GetInterpolatedValue(lower.Y, upper.Y, ratio);
var z = GetInterpolatedValue(lower.Z, upper.Z, ratio);
return new GpsCoordinate(frame, x, y, z);
}
Classe B da criança:
public double GetMph(int frame)
{
ReadData();
return GetInterpolated(frame).MilesPerHour;
}
protected override ISpeed GetInterpolatedItem(int frame, ISpeed lower, ISpeed upper)
{
var ratio = GetInterpolationRatio(frame, lower.Frame, upper.Frame);
var mph = GetInterpolatedValue(lower.MilesPerHour, upper.MilesPerHour, ratio);
return new Speed(frame, mph);
}