使用一个泛型方法还是多个重载方法更合适
本文关键字:方法 重载 泛型方法 一个 | 更新日期: 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();
}
}