У меня есть несколько классов, которые все наследуются от общего базового класса. Базовый класс содержит коллекцию из нескольких объектов типа 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);
}