为什么现在类经常被定义为接口?在过去的2-3年里,我看到的许多项目,例如Cuyahoga开源C#CMS,都倾向于将持久类和非持久类定义为接口。为什么?有充分的理由吗?测试驱动开发?纪律?设计模式?......主要原因是这使得依赖注入等技术更容易。这反过来又使软件具有更大的灵活性,并且更容易重用和重新组合现有代码。这有用的示例包括各种形式的单元测试(如您所描述的),以及大多数其他形式的“常规”代码重用。一个简单的例子:假设你有一个计算员工工资的方法。作为其签名的一部分,它接受一个计算其收益的对象,例如BenefitCalculator的一个实例:calculateSalary(...BenefitCalculatorbc,...)最初,您的设计只有一个类,BenefitCalculator。但是,事实证明你需要不止一门课,例如因为软件的不同部分应该使用不同的算法(可能支持不同的国家,或者因为算法应该是用户可配置的......)。在这种情况下,创建新类(例如BenefitCalculatorFrance或BenefitCalculatorSimple等)而不是扩充现有的BenefitCalculator实现是有意义的。现在,如果您使用签名calculateSalary(...BenefitCalculatorbc,...),您有点搞砸了,因为你不能提供不同的实现。但是,如果您使用calculateSalary(...IBenefitCalculatorbc,...)您可以使所有类都实现该接口。这实际上只是“松散耦合”的一个特例:尽可能少的需求来自代码的其他部分。在这种情况下,对某个类没有要求;只需要存在某些方法,这就是接口所做的。首先,您不能将类定义为接口。你的类实现了一个接口。接口被用作启用多态行为的一种方式。每个实现该接口的类都可以自由地指定它自己对接口中定义的方法的实现。举个例子:你正在编写银行软件。您的任务是编写事务处理程序。现在,您知道您需要处理不同类型的交易(存款、取款、转账)。你可以这样写代码:publicclassTransactionProcessor{publicvoidProcessDeposit(//ProcessDeposit);publicvoidProcessWithdraw(//ProcessWithdraw);publicvoidProcessTransfer(//流程转移);然后,每当有人添加新的交易类型时,您必须修改您的类。或者,您可以:publicinterfaceITransaction{voidProcess();}publicclassTransactionProcessor{publicvoidProccessTransaction(ITransactiont){t.Process();}}现在您不需要修改代码来处理新类型的交易。您只需要人们创建自己的实现ITransaction的类,您的类将“只处理它”。这允许您根据需要交换接口的实现。它还支持用于单元测试的依赖注入和模拟框架。但总的来说,它实际上只是另一种使代码更灵活的方法。接口的优点是它们使您实现独立,这是一件好事。在过去几年中,IoC容器在开发人员中越来越受欢迎。例如,来自MicrosoftPractices的UnityContainer。因此,在您的应用程序开始时,您可以注册实现接口的具体类,然后,例如,当通过实例化一个对象来实例化时,所有在其构造函数中具有这些接口的类,或者被标记为[Dependency]属性的类特性。Unity容器的分辨率。当一个接口可以在三个不同的类中实现时,它在具有复杂依赖关系的应用程序中非常有用。如果不使用接口,这一切都是不可能的。在非常无聊的级别进行接口也可以帮助加快编译速度。公共课A{Bb;}publicclassB{publicintgetCount(){返回10;在这种情况下,每次对B进行内部更改时,编译器都需要重新评估A以确定是否需要重新评估编译。相反,我们使用接口:classA{IBb;}接口IB{intgetCount();}B类:IB{publicintgetCount(){返回10;在这种情况下,A仅依赖于IB。对B的更改不需要在编译时考虑A。在规模上,这种对短路依赖评估的影响可以显着加快大型代码库的编译速度。当有许多类依赖于一个可以进行大量更改的类时,它尤其强大。显然,只有当类对实现类没有静态依赖时,这种编译时优势才有效。执行以下操作将完全破坏此优势:classA{IBb=newB();}这时候依赖注入就派上用场了,DI容器会构造一个B,作为IB提供给A,所以A不需要有静态依赖。以上是C#学习教程:为什么现在类经常定义为接口?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
