使用一个泛型方法还是多个重载方法更合适

本文关键字:方法 重载 泛型方法 一个 | 更新日期: 2023-09-27 18:18:50

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

我已经用下面的代码创建了一个抽象基类,每个类型都将从它继承。

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;
}

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

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

使用一个泛型方法还是多个重载方法更合适

我通常认为重载最适合于需要基于类型定制功能的场景,而泛型则适合于不依赖于类型并跨类型共享的功能。

重载类根据输入参数做不同事情的一个很好的例子是静态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();
    }
}