У меня есть несколько классов, которые все наследуются от общего базового класса. Базовый класс содержит коллекцию из нескольких объектов типа T.
Каждый дочерний класс должен иметь возможность вычислять интерполированные значения из коллекции объектов, но, поскольку дочерние классы используют разные типы, вычисление немного отличается от класса к классу.
До сих пор я копировал / вставлял свой код из класса в класс и вносил незначительные изменения в каждый из них. Но сейчас я пытаюсь удалить дублированный код и заменить его одним базовым методом интерполяции в моем базовом классе. Однако это оказывается очень трудным, и все решения, о которых я думал, кажутся слишком сложными.
Я начинаю думать, что принцип СУХОЙ не применяется в такой ситуации, но это звучит как богохульство. Насколько сложна слишком большая попытка удалить дублирование кода?
РЕДАКТИРОВАТЬ:
Лучшее решение, которое я могу придумать, выглядит примерно так:
Базовый класс:
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);
Детский класс А:
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);
}
Детский класс B:
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);
}