【发布时间】:2014-11-02 12:51:46
【问题描述】:
目标:
我一直在尝试用 C# 编写一个通用的帮助程序/实用程序类,它表示经过边界检查的数字范围。
这个想法是,用户可以通过定义最小值和最大值(例如,从 0 到 10、从 -15 到 3、从 -7 到 -2 等)来创建一个连续的数字范围。该范围还包含一个当前值,并根据上限/下限检查该值。如果当前值大于最大值(或小于最小值),则它要么被封顶,要么被环绕。我希望这个类是通用的,以便客户可以为他们的用例选择合适的类型/大小/精度。
这是我目前所拥有的:
public class Range<T> where T : IComparable<T> {
private T value;
private T min;
private T max;
private bool wrap;
public Range ( T minimumValue, T maximumValue, T initialValue, bool tempWrap = false ) {
value = initialValue;
min = minimumValue;
max = maximumValue;
wrap = tempWrap;
LimitBounds ();
}
private void LimitBounds () {
if( wrap != true ) {
if ( value > max ) { value = max; }
else if ( value < min ) { value = min ; }
}
else {
T wrapAmount = 0;
if ( value > max ) {
wrapAmount = value - max;
value = min + wrapAmount;
}
else if ( value < min ) {
wrapAmount = min - value;
value = max - wrapAmount;
}
}
}
public T GetValue() {
return value;
}
public void SetValue(T tempValue) {
value = tempValue;
LimitBounds ();
}
public void Increment() {
value++;
LimitBounds ();
}
public void Decrement() {
value--;
LimitBounds ();
}
public bool Equals(Range<T> tempRange)
{
return (value == tempRange.value);
}
public static bool operator > (Range<T> r1, Range<T> r2)
{
return (r1.value > r2.value);
}
public static bool operator < (Range<T> r1, Range<T> r2)
{
return (r1.value < r2.value);
}
public static Range<T> operator ++ ( Range<T> r ) {
r.Increment ();
return r;
}
public static Range<T> operator -- ( Range<T> r ) {
r.Decrement ();
return r;
}
}
问题:
我真的是 C# 的新手,尽管有更多的 C++ 经验,但我还是有点卡在这里。我的编译器在抱怨:
"Operator `>' cannot be applied to operands of type `T' and `T'"
.. 我的大多数运算符重载都有类似的错误。我认为,如果我确保我的类处理的类型实现“可比较”,那么重载比较运算符就可以了。我显然在这里做错了什么,但我不确定我需要做什么。
如果它简化了事情,这个类真的只需要处理纯数值/类型(字节、短、整数、浮点等)..
更新编辑 1:
如下所示,我可以通过在这些函数中切换到 CompareTo 来消除比较操作导致的一堆编译错误:
public bool Equals(Range<T> tempRange)
{
return (value.CompareTo(tempRange.value) == 0);
}
public static bool operator > (Range<T> r1, Range<T> r2)
{
return (r1.value.CompareTo (r2.value) > 0);
}
public static bool operator < (Range<T> r1, Range<T> r2)
{
return (r1.value.CompareTo (r2.value) < 0);
}
我还添加了“结构”约束。不过,我仍然不确定从这里去哪里。由于我一直在使用各种加法、减法、递增和递减运算符,我的代码仍然无法编译。我尝试添加 byte、short、int 和 float 作为额外的类型约束,但这没有奏效,并且给了我一个编译时错误。
从这里我有什么选择?因为这个类只用于处理数字范围(基本上只有各种大小的整数 [byte, short, int, long 也许] 和浮点小数)并且不能为空或引用类型,所以还有其他一些我可以的约束吗用来做这个工作?我是否必须围绕实现自定义“INumber”接口的基本数据类型创建一堆包装类?
或者这是对泛型类的滥用,我应该为不同类型创建一堆独立的范围类?是否可以创建一个实现我想要的行为类型的泛型类?
【问题讨论】:
-
运算符不是虚拟的,因此永远不能与泛型类型一起使用。使用为受约束类型定义的适用方法。请记住,泛型是 not 模板,并且不会发生“文本替换”。因此,对于泛型类本身中由
T表示的所有 类型,代码必须是类型有效的。 -
不知道类型的情况下,
Increment和Decrement方法中的value++和value--怎么办? -
呃!我明白了。。谢谢大家。最初我是用'Short's 来写这门课的,但在我开始工作后,我决定让它更通用更有用/更灵活。我考虑过制作一些类,如“IntRange”、“ShortRange”、“FloatRange”等。我认为当我弄清楚时这会好得多。我以前使用过其他人的泛型,但这是我第一次尝试写一个。 :]
标签: c# generics comparison operator-overloading operators