接口作为参数

Abh*_*ain 4 c# interface

在什么情况下有人会将接口作为参数传递(或接收)?这真的是一件有用的事情还是一种奇特的做事方式?

Dan*_*Tao 18

这是一个非常有用的东西.

采取任何LINQ扩展方法,例如.他们不关心传递给他们的东西,只要它实现IEnumerable<T>.我们的想法是,它们都可以应用于您可以使用foreach循环枚举的任何内容.

想象一下,如果它们都要求你传递T[]数组或List<T>对象,它将是多么无意义的限制.


这只是一个非常简单的例子.让我们假装LINQ扩展不存在(如果我使用.NET 2.0,这实际上是一种可能性)并且我想编写一个Sum方法.

我可以像这样写:

public static double Sum(List<double> values)
{
    double sum = 0.0;
    foreach (double value in values)
    {
        sum += value;
    }
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但在这里注意一些事情:我写了一个方法来获取a List<double>,这是一个具有比这个代码所依赖的更多功能的类.它在哪里使用Insert?它在哪里使用RemoveAtFindAllSort?不,这不是必需的.那么这个方法真的有必要通过List<double>吗?

而且,说我有一个double[].从理论上讲,我应该可以将其作为values参数弹出,因为我所做的只是使用a来枚举它foreach; 但是因为我输入valuesList<double>,要传递double[]给我的Sum方法,我必须这样做:

double sum = Sum(new List<double>(myArray));
Run Code Online (Sandbox Code Playgroud)

这只是一个完全不必要的新对象,我构建它只是为了调用真正应该能够首先处理我的原始对象的代码.

通过编写将接口作为参数的方法,您可以使代码更灵活,更强大,并且在调用代码时避免施加不适当的限制(给我一个X,即使我可以很容易地使用Y).


Mat*_*ott 6

最简单的方法是,它是关于编程接口而不是实现.比方说,我有一个方法,我想做某事,例如

public void MakeNoise(IAnimal animal)
{
  animal.MakeNoise();
}
Run Code Online (Sandbox Code Playgroud)

我不在乎具体实现是什么,我只知道无论传入什么,我都可以调用MakeNoise().我编程到一个接口,而不是一个实现.

public class Dog : IAnimal
{
  public void MakeNoise()
  {
    Console.WriteLine("Woof");
  }
}

public class Cat : IAnimal
{
  public void MakeNoise()
  {
    Console.WriteLine("Meow");
  }
}
Run Code Online (Sandbox Code Playgroud)

接口编程是OOP的核心方面,你会发现它们非常有用.