一种方法,不同的参数

时间:2014-06-23 07:40:54

标签: c# function 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);我们会收到错误,说明对象没有&#39有这种方法。

有人知道一些天才华丽的溶解吗?还是我坚持使用option1?

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());
}