一个方法,不同的参数
本文关键字:参数 方法 一个 | 更新日期: 2023-09-27 18:09:57
如果我有一个函数做一些操作(适用于两种类型中的任何一种),并且需要适用于两种不同的类型参数,是否有一些很好的方法来制作类似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);
}
在我看来,这留下了两个选择。
option1:
void foo(List<int> x)
{
Console.WriteLine(x.ToString());
}
void foo(Collection<int> x)
{
Console.WriteLine(x.ToString());
}
为什么不呢?因为如果void foo()
比几行长,它看起来很丑陋和不必要。
option2:
void foo(Object x)
{
Console.WriteLine(x.ToString());
}
为什么不呢?对于这个简单的例子来说工作得很好,但是如果foo应该做一些不是每个对象都有的事情,比如x.Add(1);
,我们会得到一个错误,说对象没有那个方法。
有谁知道什么绝妙的解决方案吗?还是选择1?
在本例中,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());
}