簡體   English   中英

一種方法,不同的參數

[英]one method, different parameters

如果我有一個函數可以執行某些操作(適用於兩種類型中的任何一種)並且需要針對兩個不同的類型參數進行操作,是否有某種不錯的方法來制作類似於public void foo(typeX x || typeY x)

例:

void main(bool b)
{
    if(b)
    {
        List<int> x = new List<int>();
        x.Add(5);
    }
    else
    {
        Collection<int> x = new Collection<int>();
        x.Add(5);
    }
    foo(x);
}

我的看法是,這留下了兩個選擇。

選項1:

void foo(List<int> x)
{
    Console.WriteLine(x.ToString());
}

void foo(Collection<int> x)
{
    Console.WriteLine(x.ToString());
}

為什么不? 因為如果void foo()的長度大於僅幾行,那么它看起來很丑陋且不必要。

選項2:

void foo(Object x)
{
    Console.WriteLine(x.ToString());
}

為什么不? 在這個簡單的示例中可以正常工作,但是如果foo應該執行並非每個對象都具有的功能,例如x.Add(1); 我們收到一個錯誤消息,指出Object沒有該方法。

有誰知道一些天才的華麗解決方案嗎? 還是我堅持使用option1?

在這種情況下, List<int>Collection<int>都實現了IList<int>接口(以及其他接口)。 因此,假設代碼不是特定於這些類型中的一種,那么您應該能夠使用該接口:

void foo(IList<int> x)
{
    Console.WriteLine(x.ToString());
}

該答案的通用版本-適用於您編寫的類-是您應該為所討論的類型創建接口。 假設您在問題開始時陳述的是TypeXTypeY

interface ICanFoo
{
    string Foo();
}

class TypeX : ICanFoo
{
    public string Foo()
    {
        return "I'm a TypeX!";
    }
}

class TypeY : ICanFoo
{
    public string Foo()
    {
        return "I'm a TypeY!";
    }
}

void foo(ICanFoo x)
{
    Console.WriteLine(x.Foo());
}

暫無
暫無

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

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