我有几个类都从通用基类继承。基类包含一些类型为的对象的集合T
。
每个子类都需要能够从对象集合中计算插值,但是由于子类使用不同的类型,因此每个类之间的计算差异很小。
到目前为止,我已经在每个类之间复制/粘贴了我的代码,并对每个代码进行了较小的修改。但是现在我试图删除重复的代码,并在我的基类中将其替换为一种通用插值方法。但是,事实证明这非常困难,而且我所想到的所有解决方案似乎都太复杂了。
我开始认为DRY原则在这种情况下不太适用,但这听起来像是亵渎神灵。尝试删除代码重复时有多少复杂性?
编辑:
我能想到的最好的解决方案是这样的:
基类:
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);
儿童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);
}
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);
}