[英]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());
}
該答案的通用版本-適用於您編寫的類-是您應該為所討論的類型創建接口。 假設您在問題開始時陳述的是TypeX
和TypeY
:
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.