7

有名な C# ライブラリC5のインターバル コレクション拡張を作成しています。インターフェイスは、同等のエンドポイント (無関係なメンバーを削除) で間隔を定義します。IInterval

public interface IInterval<T> where T : IComparable<T>
{
    T Low { get; }
    T High { get; }
}

間隔エンドポイントは、整数、日付、さらには文字列など、比較可能なものであれば何でもよいため、これは一般的にうまく機能します。

ただし、間隔の長さを計算できると便利な場合があります。間隔[3:5)の期間は 2 で、間隔[1PM, 9PM)の期間は 8 時間です。これは、要素の距離ではなく要素の順序のみを提供するため、比較対象では不可能です。たとえば、2 つの文字列間の距離を提供することは困難です。エンドポイント タイプは基本的に、間隔でスケーリングされた値でなければなりません。

のようなインターフェイスはありますか?これIComparable<T>により、一般的にエンドポイントを比較できますが、2 つのエンドポイントを減算して期間を取得したり、低エンドポイントに期間を追加して、継承インターフェイスに使用できる高エンドポイントを取得したりすることもできます。IDurationInterval<T> : IInterval<T>例えば?

またはより簡潔に: 間隔でスケーリングされた値のインターフェイスはありますか?

4

1 に答える 1

4

そのようなインターフェースは存在しません。Scala などの一部の言語には、これらの種類の操作に対する抽象化がありますが、.NET には何もありません。また、.NET ライブラリの設計者は、抽象化のレベルを追加することに関してかなり保守的であることがわかりました。複雑で抽象的なものよりも単純で具体的なものを好む傾向があるようです。おそらく、.NET Framework のライブラリのいずれにおいても差し迫った必要性がなかったため、この抽象化を追加したことはありません。また、不適切に使用すると多くのオーバーヘッドが発生する可能性がある抽象化です。

ただし、.NET の型システムには、そのようなインターフェイスを排除するものはありません。1 つではなく 2 つの型パラメーターが必要になります。1 つは実装型用で、もう 1 つは結果型用です。最も基本的なインターフェースは次のようになります。

interface IAlgebraic<T, R> {
  T Add(R value)
  R Subtract(T value)
}

残念ながら、このインターフェイスを Int32 や DateTime などの既存の型に追加する方法はありません。これらのタイプの場合、の結果が必要になりIComparable<T>ますComparer<T>

interface IAlgebraicOps<T, R> {
  T Add(T x, R y)
  R Subtract(T x, T y)
}
于 2015-07-19T11:46:08.260 に答える