2014-06-23 77 views
0

如果我有做一些操作(即工作分爲以下兩種類型之一),並且需要兩個不同類型的工作參數的函數,是有一些不錯的方法,使像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沒有這個方法。

有沒有人知道一些天才的華麗sollution這個?或者我堅持選擇1?

+0

如果你的類型不是東西,如原語或集合,你爲什麼不只是創建一個接口,讓想類型爲富處理? –

回答

2

在這種情況下,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()); 
} 
+0

謝謝。我正在尋找更一般的方式:)界面看起來不錯 –

相關問題