使用一个通用方法或多个重载方法更合适吗?

时间:2013-06-17 17:02:26

标签: c# generics overloading

我正在开展一个项目,我将处理许多类型的数学值,例如分数,十进制数和数学常数(即pi,Euler数)。

我创建了一个抽象基类,使用此代码从中继承每个类型。

public abstract class MathValue
{
    public abstract double Value { get; set; }

    protected bool irrational;

    public virtual bool IsIrrational
    {
        get { return this.irrational; }
    }

    public virtual T ToValueType<T>(bool ignoreConstraints) where T : MathValue;

    public abstract MathValue Add<TParam>(TParam val) where TParam : MathValue;
    public abstract MathValue Subtract<TParam>(TParam val) where TParam : MathValue;
    public abstract MathValue Multiply<TParam>(TParam val) where TParam : MathValue;
    public abstract MathValue Divide<TParam>(TParam val) where TParam : MathValue;
}

但是我现在质疑在这里使用泛型方法是否合适,或者我是否应该在每个派生类中用重载方法替换这些方法。

在这种情况下哪个更合适?

1 个答案:

答案 0 :(得分:2)

我通常认为重载最适合需要根据类型自定义功能的场景,但泛型适用于非类型相关且跨类型共享的功能。

基于输入参数执行不同操作的重载类的一个很好的例子是静态Convert类方法,例如ToInt32,它有32次重载。

对于任何类型执行相同操作的泛型类的一个很好的示例是List<T>,它允许您以强类型方式将任何类型放入List中,对任何类型T都采用相同的方式。

返回ToString()值的示例:

如果我想为每种类型输出不同的ToString(),我会针对不同的参数类型使用不同的重载(甚至不同的类):

public class MyMathClass
{
    public string GetToString(int myValue)
    {
        return "My Int: " + myValue;
    }

    public string GetToString(double myValue)
    {
        return "My Double: " + myValue;
    }
}

如果我想为任何对象输出ToString,我可能不会使用泛型,因为任何对象都有ToString()方法......但是为了我的例子,我将:

public class MyMathClass<T>
{
    public void GetToString<T>(T myValue)
    {
        return myValue.ToString();
    }
}