繁体   English   中英

是否应将具有值类型的重载方法合并为通用方法?

[英]Should overloaded methods with value types be consolidated into a generic method?

在进行OO设计时,将使用简单值类型的方法集合合并为通用方法更好吗? 例如:

public int Sum(int x, int y)

// Overload with float.
public float Sum(float x, float y)

合并为:

public T Sum<T> (T x, T y)

谢谢,

斯科特

通常,是的,但是,特别是对于您的示例(两个参数相加)-您不能使用泛型,因为+运算符不是可以将泛型类型参数约束到的任何接口的一部分:)

(注意:这是我在C#中谈论的内容,可能仍然可以使用其他语言)

某些情况下,是(并非总是); 尽管有相反的传言,这是可能的。 我为“ MiscUtil” (免费等)编写了一些代码, 正是这样做的,并且适用于具有适当运算符的所有类型(甚至是您自己的结构和类,或者Nullable<T>等)。

这里的问题是,没有支持Add等的接口,因此在dynamic之前(在4.0中),这样做很棘手。 但可以完成-这是用法页面 ,带有类似的Sum (“ MiscUtil”中的实际代码稍微复杂一些):

public static T Sum<T>(this IEnumerable<T> source)
{
    T sum = Operator<T>.Zero;
    foreach (T value in source)
    {
        if (value != null)
        {
            sum = Operator.Add(sum, value);
        }
    }
    return sum;
}

再次说明,在4.0中,其中很多相对简单的是dynamic ,因为它支持运算符。 但是,上一次我对它进行基准测试时, dynamic比我(滥用) Expression慢。

顺便说一句,标准LINQ 可以提供Min / Max的原因是由于IComparable / IComparable<T> ,由Comparer<T>.Default辅助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM