为什么类现在往往被定义为接口?

Afs*_*bbi 13 c# design-patterns interface

去年这2-3个,我看到的许多项目,如Cuyahoga开源C#CMS,倾向于将持久性和非持久性类定义为Interface.为什么?有充分的理由吗?TDD?惩戒?一个设计模式?...

sle*_*ske 21

主要原因是这使得依赖注入等技术更容易.这反过来又允许软件具有更大的灵活性,并且更容易重用和重新组合现有代码.这有用的示例包括各种形式的单元测试(如您所提到的),还有大多数其他形式的"常规"代码重用.

一个简单的例子:

假设你有一个计算emplyoee工资的方法.作为其签名的一部分,它接受一个计算其好处的对象,例如BenefitCalculator的一个实例:

calculateSalary(... BenefitCalculator bc, ...)
Run Code Online (Sandbox Code Playgroud)

最初,您的设计只有一个类BenefitCalculator.但后来,事实证明你需要不止一个类,例如因为软件的不同部分应该使用不同的算法(可能支持不同的国家,或者因为算法应该是用户可配置的......).在这种情况下,不是膨胀现有的BenefitCalculator实现,而是创建新的类是有意义的,例如BenefitCalculatorFrance,或BenefitCalculatorSimple等.

现在,如果您使用签名

calculateSalary(... BenefitCalculator bc, ...)
Run Code Online (Sandbox Code Playgroud)

,你有点搞砸,因为你不能提供不同的实现.但是,如果你使用

calculateSalary(... IBenefitCalculator bc,...)

你可以让所有类实现接口.

这实际上只是"松耦合"的一个特例:需求尽可能少来自代码的其他部分.在这种情况下,不要求某一类; 而只是要求存在某些方法,这正是接口的作用.