1

我正在从事一个项目,我将在其中使用多种类型的数学值,例如分数、十进制数和数学常数(即 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;
}

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

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

4

1 回答 1

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();
    }
}
于 2013-06-17T17:07:09.707 回答