我已经写了10年的C#代码,但是我不太清楚何时应该使用接口而不是使用Func或Action。在很多调用接口方法的地方,似乎使用Func或Action同样有效。所以我的问题是:如果我有一个只有一个方法或几个方法的接口,那么使用Func或Action会有什么劣势吗?对我来说,使用Func或Action更加简洁。
非常感谢。
非常感谢。
Action
或Func
与包含一个方法的接口进行比较,但不同之处在于你可以提供任何符合参数/返回值要求的Action
或Func>,而使用接口时,提供的对象必须实现该接口。
也许你可以称Action
和Func
为“匿名单方法接口”。
但从设计角度来看,你的类模型将是一组没有彼此联系的方块。
IAnimal animal = AnimalFactory.GetAnimal();
animal.Run();
animals.ForEach(x => x.Run());
或者:
animals.ForEach(x => /* do something completely different here */);
以上代码行是一种行为,只有调用者决定发生什么,而不是通过简单调用实例上的方法来委托逻辑。
它们解决不同的问题,因此我很想知道人们如何认为在某些情况下它们是可替换的。
IAnimal
除了public void Run()
之外没有其他内容,那么它实际上并没有什么用处。它不返回任何东西,如果Run
具有副作用,则这些副作用是不可见的。IAnimal
之所以有用,是因为它会引起通过其他方法可见的副作用,例如Position
或Stamina
。委托只真正替换具有单个方法的接口。 - Servy当您不关心正在使用哪种对象时,可以使用接口...
让我们来看一个教科书例子
公共类动物;
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();