我的问题很简单,一切都是在我意外地看到Iterable接口的源代码之后开始的。我以为我会发现这个接口有一个名为“AbstractIterator”的抽象类的成员,或者类似的东西,但事实证明它是一个接口。
为什么呢?为什么迭代器不是抽象类? 接口用于定义某个特征 - 这就是为什么“有能力”的结尾会弹出这么多特征的原因。但事实证明,java似乎持有不同的观点。请解释......:)
P.s:List,Set等在我看来也应该是抽象类 - 所以我的问题也是关于他们的......
答案 0 :(得分:3)
Iterator
的每个实现对于迭代的集合都是唯一的。这些不足以保证抽象基类的通用代码。
那就是说接口的使用比抽象类的限制要少得多。请记住,在Java中,类只能扩展单个基类。因此,如果这些接口是抽象类,则实现者将无法扩展任何其他类。使用接口离开为实现者提供了完整的类层次结构自由。
拥有一个接口和一个抽象类是很常见的。这种组合允许完全自由地实现接口,但允许在实现可以使用抽象类的情况下重用代码。
答案 1 :(得分:1)
Java只允许接口进行多重继承,类(包括抽象类)只能使用单继承。因此,当您创建一个List
抽象类时,无论他的功能和业务需求是什么,您都会强制任何实现者遵循您的类设计。另外,您无法在一个类中实现不同的行为。有点像实现Stack
行为加上List
行为是不可能的。
由于部分实现通常很有用,您有时会在JDK中找到triptychon的接口,抽象类和默认实现,例如使用TableModel
,AbstractTableModel
和DefaultTableModel
。您可以选择要绑定到类层次结构的数量。当您已经有一个强制您使用特定类的层次结构时,您仍然可以实现该接口。
Java在这方面是非常静态的。与其他语言相比,人们应该更多地支持组合而不是其他语言。
答案 2 :(得分:0)
将Iterator声明为接口的好处是为客户提供了一种简单的方法来遍历内部集合的每个项目,而无需向他提供有关具体实现的信息(即ArrayList,Vector,XML-File?,...)
因此,迭代器设计模式使具体实现可以互换,而无需更改客户端代码。
此外,您可以编写自己的迭代器实现,没有任何限制,这是将Iterator声明为接口的最重要优势。例如,您可以编写Iterator,迭代特定的数据库表,或迭代文本行。
谷歌的“迭代器设计模式”,以获取有关其优势(和缺点)及其使用的更多信息。
此致 鲍勃