在C#中,有时我希望能够为特定的泛型类"实例化"创建特殊方法。
更新:以下代码只是更抽象问题的愚蠢示例 - 不要过于关注时间系列,只需为某些T添加额外的方法的原则。
示例:
更新:以下代码只是更抽象问题的愚蠢示例 - 不要过于关注时间系列,只需为某些T添加额外的方法的原则。
示例:
class Timeseries<T>
{
...
TimeSeries<T> Slice(...) { ... }
}
如果 T 是 double,我希望有一些额外的方法,比如 Integrate()
、Interpolate()
等,这些方法只对 double
有意义,因为我需要对它们进行算术运算。
有几种方法可以实现这个目的,但我找不到满意的方法。
1. 继承到一个特殊的类中
class TimeseriesDouble : Timeseries<double>
{
double Interpolate(...) { ... }
...
}
缺点:TimeseriesDouble.Slice()
会返回一个新的Timeseries<double>
对象,现在缺少了我的特殊方法。
2. 外部方法
public static double Interpolate(Timeseries<double> ts, ...) { ... }
缺点:违反了面向对象的原则。我不想将我的方法放在其他地方。此外,这些方法可能需要私有/受保护状态。
3. 扩展方法
与2相同,只是具有更好的调用语法。
4. 共同基类
class TimeSeries_base { ... }
class TimeSeries<T> : TimeSeries_base { .. typesafe versions of methods .. }
class TimeSeriesDouble : TimeSeries_base { .. typesafe versions of methods .. }
缺点: TimeSeries_base
中的许多内容都被复制到了两个子类中。基类可能只成为子类实用函数的占位符。
优点: 我现在可以动态地执行像List<TimeSeries_base>
这样的操作。
5. 忘记一个公共类
即,在代码中将Timeseries<T>
和TimeseriesDouble
分开。
缺点: 然后我就无法充分利用将TimeseriesDouble
视为TimeSeries<T>
的所有好处,例如使用ZIP(A,B)组合两个时序,其中一个恰好是双倍。
其他想法? 目前,我认为我最喜欢设计(1)。