当前位置:  开发笔记 > 编程语言 > 正文

C#中泛型类的专业化模式?

如何解决《C#中泛型类的专业化模式?》经验,为你挑选了2个好方法。

在C#中,我有时希望能为泛型类的某些"实例化"创建特殊方法.

更新:下面的代码只是一个更抽象问题的一个愚蠢的例子 - 不要太关注时间序列,只是为某些T"添加额外的方法"的原则.

例:

class Timeseries 
{ 
    ...
    TimeSeries Slice(...) { ... }
}

在T是double的情况下,我想要一些额外的方法,比如Integrate(),Interpolate()等等只有意义double,因为我需要对它们进行算术运算.

有几种方法可以做到这一点,但我找不到一个我满意的方法.

1.继承一个特殊的类

class TimeseriesDouble : Timeseries
{ 
    double Interpolate(...) { ... }
    ...
}

缺点: TimeseriesDouble.Slice()将返回一个新Timeseries对象,现在缺少我的特殊方法.

2.外部方法

public static double Interpolate(Timeseries ts, ...) { ... }

缺点:打破OO原则.而且我不想放弃我的方法.此外,这些方法可能需要私有/受保护状态.

3.扩展方法

与2相同,只是使用更好的调用语法.

4.共同基类

class TimeSeries_base { ... }
class TimeSeries : TimeSeries_base { .. typesafe versions of methods .. }
class TimeSeriesDouble : TimeSeries_base { .. typesafe versions of methods .. }

缺点:太多的东西重复TimeSeries_base进入两个子类.基类可能只是子类的实用程序函数的占位符.

亲:我现在可以做List动态的事情了.

忘了一个普通的课

即,保持TimeseriesTimeseriesDouble分开代码.

缺点:然后我没有得到TimeseriesDouble像处理一样的所有好处TimeSeries,例如将两个时间序列与ZIP(A,B)组合,其中一个恰好是双打.


还有其他想法吗? 目前,我认为我最喜欢的设计(1).



1> Jon Skeet..:

你总是可以使用自引用泛型技巧:

public class TimeSeries where U : TimeSeries
{
    U Slice(...)
}

public class TimeSeriesDouble : TimeSeries
{
    ...
}

它可以让你有点脑弯曲,但它可以工作.



2> Mark Cidade..:
interface ITimeSeries { ... }

abstract class TimeSeriesBase where TS : TimeSeriesBase 
 { public TS Slice() { ... } 
 }

class TimeSeries:TimeSeriesBase>,ITimeSeries {}

class TimeSeriesDouble:TimeSeriesBase,ITimeSeries
 { public double Interpolate() { ... }
 }

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有