我已经编写 C# 代码 10 年了,但我非常不知道何时使用接口与使用 Func 或 Action。在我看来,在调用接口上的方法的许多地方,Func 或 Action 也可以正常工作。所以,我想我的问题是这个。如果我的接口只有一个方法,或者可能有几个方法,那么使用 Func 或 Action 有什么缺点吗?使用 Func 或 Action 对我来说似乎更干净。
非常感谢。
我想您可以将Action
orFunc
与包含一个方法的接口进行比较,不同之处在于您可以提供任何 满足参数/返回值要求的 or ,在使用接口时,提供的对象必须实现该接口Action
。Func
也许您可以调用Action
“Func
匿名单一方法接口”。
但是,如果您从设计角度来看,您的类模型将是块的绘图,它们之间没有任何线条。
如果预计实现非常短(一两行),尤其是预计实现需要局部变量(闭包)时,您应该使用委托和 lambda 表达式。
我不得不承认,我对这个问题有点困惑。像@deepee 一样,我同意这里的代码示例可以很好地说明为什么您认为您会使用一种方法而不是另一种方法。
我感到困惑的原因是我不会想到问这个问题,因为它们有不同的目的。接口主要用于多态;这样人们就可以以相同的方式处理不同的实现。
Jon Skeet 有一个很好的使用 Func 和 Action 的例子。
接口允许您这样做:
IAnimal animal = AnimalFactory.GetAnimal();
animal.Run();
使用上面的代码,你不知道也不关心它是什么动物。您只知道它可以运行并且您希望它运行。更重要的是,调用者不知道动物是怎么跑的。这就是 Action 和 interfaces/polymorphism 之间的区别。做某事的逻辑在具体类中。
当调用者知道实际逻辑时, Action 将允许您对每个实例执行相同的操作,而不是让每个具体实例执行某些操作:
animals.ForEach(x => x.Run());
或者:
animals.ForEach(x => /* do something completely different here */);
上面的代码行是只有调用者决定应该发生什么的动作,而不是通过简单地调用它的方法将逻辑委托给实际实例。
They solve different problems, so I'm curious to see how folks think they're interchangeable in certain situations.
当您并不真正关心您正在使用哪种对象时,您会使用接口......
让我们来看教科书的例子
公共类动物;
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();