簡體   English   中英

使用一種通用方法還是多種重載方法更合適?

[英]Is using one generic method or multiple overloaded methods more appropriate?

我正在一個項目中工作,我將在其中處理多種類型的數學值,例如小數,十進制數和數學常數(即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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM