我正在开展一个项目,我将处理许多类型的数学值,例如分数,十进制数和数学常数(即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;
}
但是我现在质疑在这里使用泛型方法是否合适,或者我是否应该在每个派生类中用重载方法替换这些方法。
在这种情况下哪个更合适?
答案 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();
}
}