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?它在哪里使用RemoveAt?FindAll?Sort?不,这不是必需的.那么这个方法真的有必要通过List<double>吗?
而且,说我有一个double[].从理论上讲,我应该可以将其作为values参数弹出,因为我所做的只是使用a来枚举它foreach; 但是因为我输入values了List<double>,要传递double[]给我的Sum方法,我必须这样做:
double sum = Sum(new List<double>(myArray));
Run Code Online (Sandbox Code Playgroud)
这只是一个完全不必要的新对象,我构建它只是为了调用真正应该能够首先处理我的原始对象的代码.
通过编写将接口作为参数的方法,您可以使代码更灵活,更强大,并且在调用代码时避免施加不适当的限制(给我一个X,即使我可以很容易地使用Y).
最简单的方法是,它是关于编程接口而不是实现.比方说,我有一个方法,我想做某事,例如
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的核心方面,你会发现它们非常有用.
| 归档时间: |
|
| 查看次数: |
664 次 |
| 最近记录: |