我在制作著名的区间集合扩展图书馆C5。IInterval接口定义了一个具有可比较端点的间隔(不相关的成员被删除):
public interface IInterval<T> where T : IComparable<T>
{
T Low { get; }
T High { get; }
}这在一般情况下是很好的,因为区间端点可以是任何类似于整数、日期甚至字符串的类似的东西。
然而,有时能够计算间隔的持续时间是有利的。间隔[3:5)的持续时间为2,间隔[1PM, 9PM)的持续时间为8小时。这在可比较的情况下是不可能的,因为它只给出元素的顺序,而不是它们的距离,例如,很难给出两个字符串之间的距离。端点类型基本上必须是区间标度值。
是否有像IComparable<T>这样的接口,允许我比较一般的端点,但也可以做一些事情,比如减去两个端点以获得持续时间,以及向低端点添加一个持续时间,以获得可以用于继承接口(例如IDurationInterval<T> : IInterval<T> )的高端点?
或者更简洁:是否有一个区间缩放值的接口?
发布于 2015-07-19 11:46:08
不存在这样的接口。有些语言,比如Scala,对这类操作有抽象,但是.NET没有。此外,我发现.NET库设计人员在添加抽象级别时相当保守:与复杂和抽象相比,他们更喜欢简单和具体的抽象。他们从来没有添加过这种抽象,大概是因为在.NET框架的任何一个库中都从来没有对它有迫切的需求。而且,它是一种抽象,如果使用不当,会造成大量开销。
但是,.NET的类型系统中没有任何东西排除这样的接口。它需要两个类型参数,而不是一个:一个用于实现类型,另一个用于结果类型。最基本的接口可能如下所示:
interface IAlgebraic<T, R> {
T Add(R value)
R Subtract(T value)
}不幸的是,无法将此接口添加到现有类型,如Int32和DateTime。对于这些类型,您需要IComparable<T>'s Comparer<T>的推论。
interface IAlgebraicOps<T, R> {
T Add(T x, R y)
R Subtract(T x, T y)
}https://stackoverflow.com/questions/31445653
复制相似问题