接口(接口/抽象类)不是抽象?

San*_*box 11 abstraction design-patterns interface

最近,我一直在阅读有关接口是抽象的错误概念的帖子.其中一篇文章是http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstractions.aspx

我有点困惑.如果我没有接口(接口/抽象类),那么我将如何注入我的依赖项并模拟它们?

另外,我听过人们谈论不使用只有一个实现者的接口.像这样的博客在这里- http://simpleprogrammer.com/2010/11/02/back-to-basics-what-is-an-interface/

现在所有这一切,它是否违反了原则 - 程序到接口而不是实现?

Joh*_*mez 6

对接口而不是实现进行编程更多的是使用数据抽象和封装.

当我们在编程方面对接口说"接口"时.这种接口意味着类的外部方法和属性.它不必是语言级接口.(关键字界面.)

您应该努力确保您的代码不依赖于其他类的内部细节.

  • 正确.更具体地说,方法和属性的公共签名构成了该类的接口.无论你选择公开什么,任何时候创建一个类都会成为该类外部接口的一部分.改变它,打破那些依赖它的人.如果另一个类依赖的不仅仅是你的接口,(它们依赖于类中的特定实现细节,例如如何对列表进行排序或存储数据),那么即使更改小的内部事物也会破坏它们. (5认同)

Boz*_*zho 5

我会说我不同意链接文章中的许多要点:

  • 接口合同.合同有两部分 - 方法签名(纯语法)和文档.

  • 接口抽象的.我看不到LSP违规的例子.这个IRectangle例子根本不是一个好例子.可以说同样的事情Set extends Collection,不允许添加重复项.如果你被传递了,Collection你可能会感到惊讶它不允许重复.通过Collection接口,可以通过记录实现者可能添加限制来处理这些问题

  • 漏洞抽象是不可避免的.但这完全取决于设计师.而btw"接口是漏洞抽象"意味着它们抽象的.

  • 这些家伙似乎错过了"曝光"单元测试.模拟实现是使用接口的一个很好的理由(尽管你也可以模拟具体的类).

  • 我们当前项目的一个很好的例子 - 最初我们只有一个DAO实现 - 一个从数据库中获取东西.但后来我们将部分操作转换为专用搜索引擎.我们添加了DAO的另一个实现,然后我们去了.因此,拥有一个实现的接口最初得到了回报.

  • 顺便说一句,最初SortedSet在JDK中只有一个实现 - TreeSet.现在它有两个.还有更多来自外部图书馆的人.

  • 最后,接口(作为一种语言结构)是一种描述类功能的方法,具有不允许任何实现滑入的额外功能.也就是说 - 接口是一种难以滥用的提供抽象的方式.

总而言之,你不需要任何接口.但这取决于具体情况.例如,我不使用辅助类的接口.并且文章的有效点是"对界面的编程"不一定包括interface关键字.类的"公共接口"(理论上)是其公共方法的集合.