我已经编写了10年的C#代码,但是我确切地知道何时使用接口而不是使用Func或Action是非常弱的。在我看来,在调用接口上的方法的许多地方,Func或Action也可以正常工作。所以,我猜我的问题是这个。如果我有一个只有一个方法的接口,或者可能有几个方法,那么使用Func或Action是否有任何不利之处?使用Func或Action对我来说似乎更清晰。
非常感谢。
答案 0 :(得分:7)
我想您可以将Action
或Func
与包含一种方法的界面进行比较,区别在于您可以提供任何 Action
或{{ 1}}满足参数/返回值要求,当使用接口时,提供的对象必须实现该接口。
也许您可以调用Func
和Action
“匿名单方法接口”。
如果你看一下设计透视图,你的类模型将是一个块的绘图,它们之间没有任何线条。
答案 1 :(得分:4)
如果预期实现非常短(一行或两行),则应使用委托和lambda表达式,特别是如果预期实现需要局部变量(闭包)。
答案 2 :(得分:2)
我不得不承认,我对这个问题感到有些困惑。就像@deepee一样,我同意一个代码示例在这里很好地说明为什么你认为你会使用一种方法而不是另一种方法。
我混淆的原因是我不会想到问这个问题,因为它们有不同的用途。接口主要用于多态性;因此,人们可以以相同的方式处理不同的实现。
Jon Skeet使用Func和Action good example。
接口允许您这样做:
IAnimal animal = AnimalFactory.GetAnimal();
animal.Run();
使用上面的代码,你不知道或关心它是什么类型的动物。你只知道它可以运行,你希望它运行。 更重要的是,来电者不知道动物如何 。这是Action和接口/多态之间的区别。做某事的逻辑在具体的课堂上。
Action将允许您为每个实例执行相同的操作,当调用者知道实际逻辑时,而不是让每个具体实例执行某些操作:
animals.ForEach(x => x.Run());
或者:
animals.ForEach(x => /* do something completely different here */);
上面的代码行是只有调用者决定应该发生什么的操作,而不是通过简单地调用它上面的方法将逻辑委托给实际实例。
他们解决了不同的问题,所以我很想知道人们认为在某些情况下他们是可以互换的。
答案 3 :(得分:1)
当你真的不关心你正在使用什么样的对象时,你会使用一个接口......
我们来看看教科书的例子
公共类动物;
public class Dog : Animal, IRunningAnimal { }
public class Cheetah : Animal, IRunningAnimal { }
public class Fish : Animal, ISwimmingAnimal { }
public class Gator : Animal, ISwimmingAnimal, IRunningAnimal { }
public interface IRunningAnimal
{
public void Run();
}
public interface ISwimmingAnimal
{
public void Swim();
}
public abstract class Animal
{
/// ...
public abstract void Move();
}
然后在代码的某处...
RunningAnimal runner = getAnimal();
//make him run
runner.Run();
每只正在运行的动物可能以不同的方式运行,但它们都可以运行。
或更好
if(getAnimal() instanceof RunningAnimal) getAnimal().Run();
else getAnimal().Move();