7

我正在对著名的 C# 库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>例如?

或更简洁:是否有区间缩放值的接口?

4

1 回答 1

4

不存在这样的接口。一些语言,比如 Scala,对这些类型的操作有抽象,但 .NET 没有。此外,我发现 .NET 库设计者在添加抽象级别时相当保守:似乎他们更喜欢简单和具体而不是复杂和抽象。他们从未添加过这种抽象,大概是因为在任何 .NET Framework 的库中都没有迫切需要它。此外,如果使用不当,它是一种抽象,可能会导致大量开销。

但是,.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)
}
于 2015-07-19T11:46:08.260 回答