一个方法,不同的参数

本文关键字:参数 方法 一个 | 更新日期: 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());
}

这个答案的一般化版本——适用于您编写的类——是您应该为所讨论的类型创建一个接口。假设您有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());
}