簡體   English   中英

方法重載對象和未指定的類型

[英]Method overloads object and unspecified type

我有以下方法過載:

public string GetName(object obj)
{
    return obj.ToString();
}

public string GetName(CustomClass cc)
{
    return cc.Name + " - " + cc.Description;
}

現在,如果我使用擁有CustomClass的無類型IEnumerable調用該方法,則將調用GetName(object obj)來解決此問題,我修改了如下方法:

public string GetName(object obj)
{
    if (obj is CustomClass)
        return GetName(obj as CustomClass);

    return obj.ToString();
}

我認為編寫20條IF語句並捕獲所有其他可能性非常煩人,是否有一種更簡單的方法可以使用無類型的IEnumerable枚舉來調用正確的重載?

這是調用GetName(object obj)的代碼:

IEnumerable rawData = GetData(); //DataBase method that fetches a CustomClass

foreach (var rawDataItem in rawData)
{
    Debug.Print(GetName(rawDataItem)); //calls the GetName(object obj) overload
}

請不要告訴我從CustomClass覆蓋ToString,幫助我解決此方法調用問題。

好吧,您可以使用動態類型 這基本上會將重載解析推遲到執行時間:

foreach (dynamic rawDataItem in rawData)
{
    Debug.Print(GetName(rawDataItem));
}

請注意,這里可能存在性能成本-可能很小且無關緊要,但是值得注意。

編輯:要處理事情的遞歸方面,您可能想要兩個不同的名稱,例如GetNameGetNameImpl ,其中GetName委托給GetNameImpl ,這就是所有有用的重載都被調用的地方。 因此,您將擁有:

// Note that dynamic as a parameter type is equivalent to object for callers.
// The dynamic part is only relevant within the method.
public string GetName(dynamic obj)
{
    return GetNameImpl(obj);
}

// Fallback when no other overloads match
private string GetNameImpl(object obj)
{
    ...
}

private string GetNameImpl(IEnumerable obj)
{
    // Maybe build up the name by calling GetName on each element?
}

請注意,這存在一個潛在的問題:如果您對不同的接口有兩個重載,並且一個類型實現了兩個接口(但是該類型本身沒有特定的重載),那么在執行時會遇到異常。

如果希望調用者能夠直接調用重載,則可以將動態的一個重命名為GetNameDynamic ,而其他的重命名為GetName (並將它們公開)。

我很少發現, dynamic是一個很好的解決方案,但它避免代碼重復。 我會嘗試退后一步,說實話,找到其他設計。 您在問題中明確拒絕了它,但是多態處理此問題的首選方式。 您不必重寫ToString您可以使所有自定義類型實現特定的接口,並在可用的情況下使用該接口。

return GetName((dynamic)obj);

將重載解析推遲到運行時。

如果沒有動態類型,支持雙調度的經典OOP解決方案(其中調用的方法取決於具有該方法的對象的具體類型和所傳遞對象的具體類型兩者)是訪問者模式

嘗試這個:

public string GetName(object obj)
{
    if (!(obj is IEnumerable<object>))
        return GetName(obj as CustomClass);

    return obj.ToString();
}

暫無
暫無

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

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