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