如果我有一个执行某些操作的函数(适用于两种类型中的任何一种)并且需要适用于两个不同的类型参数,那么有一些很好的方法来制作像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);
我们会收到错误,说明对象没有&#39有这种方法。
有人知道一些天才华丽的溶解吗?还是我坚持使用option1?
答案 0 :(得分:2)
在这种情况下,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());
}