为什么任何类型的抽象都使用接口而不是抽象类?

时间:2010-01-29 12:08:20

标签: asp.net-mvc oop repository interface abstract-class

Heyho,

我的脑海中有一个问题已经有一段时间了,希望你们中的一些人可以迅速解决这个问题:

在我的案例中,我是MVC,ASP.Net Mvc的忠实粉丝。

我注意到的是关于接口的炒作。每个视频,教程和书籍似乎都可以通过接口解决任何类型的抽象问题。我已经调整了这些模式,理解了为什么以及如何,我基本上对它非常满意。

但我不知道为什么界面在任何地方使用。我几乎从未见过抽象基类的抽象,我不明白。也许我想念一些东西?我知道你只能从一个基类继承而多个接口是可能的。但是接口确实有缺点,特别是当需要进行一些更改时,这会破坏您的实现。 到目前为止,在我的项目中,我只习惯为完全不同的类选择接口。

例如,整个存储库模式可以使用抽象基类完成,仍然提供可测试性和可交换性,还是我错过了什么?

请指出我的大脑滞后的部分:)

6 个答案:

答案 0 :(得分:6)

接口用于教程,博客和其他地方,因为这些作者特别受到一组称为“可测试性设计”的方法的影响。

主要是,可测试性学校的设计使用各种方式的接口,因为他们希望能够模拟测试中的任何组件。如果你使用具体的类,那么很多模拟工具都无法模拟这些类,因此会很难测试你的代码。

答案 1 :(得分:3)

A Story

  

我曾经参加过Java用户组   会见James Gosling(Java的   发明家)是特色演讲者。   在令人难忘的Q& A会议期间,   有人问他:“如果你能做到的话   Java再次,你会是什么   改变?“”我会把课程留下来,“他说   回答。笑声消失后,   他解释说真正的问题   本身不是课程,而是   实现继承(   延伸关系)。接口   继承(工具   关系)是可取的。您   应该避免实施   尽可能继承。

虽然仅使用或主要使用Interfaces确实存在代码重用问题(以及消除了良好的基类),但它使得像事物一样进行多重继承变得容易得多。除了具有广泛不同的实现方式之外,您还不必担心基类更改甚至不知道它的作用(您必须实现整个事情,所以这需要权衡)。

P.S。我认为新的Go语言基于接口而不是继承(看起来很有趣)。

答案 2 :(得分:2)

如果语言不支持多继承或混合,则与接口相比,抽象基类的范围有限。例如。在.NET中,如果必须从MarshalByRef等其他类型继承,则不能使用抽象基类来实现模式。接口不会强加此限制。

答案 3 :(得分:2)

除了您提到的事实,您只能从单个基类继承(如果您想使用已经从具有新框架基类的某个类继承的现有类,这非常不方便),您还可以避免使用{ {3}}如果您使用接口,则会出现问题。

答案 4 :(得分:1)

在这里阅读接口,抽象类,重大变化和MVC:http://ayende.com/Blog/archive/2008/02/21/Re-Versioning-Issues-With-Abstract-Base-Classes-and-Interfaces.aspx

在那里(或Ayende博客上的某个地方else)提供的一个解决方案是:使用界面,但也提供抽象类。那些关于破坏变化的人可以将他们的实现基于抽象类。那些需要接口电源的人也很满意。但请确保您的方法接受接口而不是抽象类作为输入。

答案 5 :(得分:0)

对接口进行编码可使您的设计更加灵活和可扩展。例如,插件框架和依赖注入。没有接口,它的可扩展性非常有限。