2013-05-29 6 views
1

Мой вопрос довольно прост, и все это началось после того, как я случайно увидел исходный код интерфейса Iterable. Я думал, что найду этот интерфейс имеет член абстрактного класса под названием «AbstractIterator» или что-то в этом роде, но, оказывается, это интерфейс.Java: Iterator, Iterable - интерфейс или абстрактный класс?

Почему? Почему Iterator не является абстрактным классом? Интерфейсы используются для определения определенного признака - поэтому «способный» конец выдается на многие из них. Но оказывается, что у java есть другое представление, как кажется. Объяснение, пожалуйста ... :)

Ps: List, Set и т.д., также, на мой взгляд, как предполагается, абстрактные классы - поэтому мой вопрос о «Em, а также ...

+0

почему должны быть абстрактные классы? если вы хотите заключить контракт, тогда интерфейс достаточно ('java.util.List'), если вы хотите навязать контракт и делиться своим поведением, тогда вы могли бы с абстрактным классом (' java.util.AbstractList ') – fGo

+0

Как и в случае с набором, списком и другими материалами Коллекций, они могут иметь схожие функции (таким образом, интерфейс), но их реализации очень разные, просто рассмотрите arraylist и связанный список, если они были подклассифицированы из абстрактного списка, который они придется переписать много кода. – arynaq

ответ

3

Каждая реализация Iterator уникален для коллекции, которая выполняет итерацию. Недостаточно общего кода, чтобы гарантировать абстрактный базовый класс.

Это говорит о том, что использование интерфейса гораздо менее ограничительно, чем абстрактный класс. Помните, что в Java класс может распространять только один базовый класс. Поэтому, если эти интерфейсы были абстрактными классами, разработчики не смогли бы расширить любой другой класс. Использование интерфейса оставляет дает разработчику полную свободу иерархии классов.

Очень распространено иметь интерфейс и абстрактный класс. Эта комбинация обеспечивает полную свободу реализации интерфейса, но позволяет повторное использование кода в тех случаях, когда реализации могут использовать абстрактный класс.

1

Java допускает множественное наследование только для интерфейсов, классы (включая абстрактные классы) могут использовать только одно наследование. Поэтому, когда вы создадите абстрактный класс, вы должны заставить любого разработчика следовать вашему дизайну класса, независимо от того, что потребует его функциональные и бизнес-требования. Кроме того, вы не можете реализовать различное поведение в одном классе. Что-то, что, например, реализует поведение Stack, а поведение List было бы невозможным.

Как частичные реализации часто полезны, вы иногда найдете триптих интерфейса, абстрактный класс и реализацию по умолчанию в JDK, например. с TableModel, AbstractTableModel и DefaultTableModel. Вы можете выбрать, насколько вы хотите привязываться к иерархии классов. Когда у вас уже есть иерархия, которая заставляет вас использовать определенный класс, вы все равно можете реализовать интерфейс.

Java довольно статична в этом отношении. Здесь лучше придерживаться композиции над наследованием, чем на других языках.

0

Преимущество объявления Iterator как интерфейса - предоставить клиентам простой способ пройти через каждый элемент вашей внутренней коллекции, не предоставляя ему информацию о конкретной реализации (то есть ArrayList, Vector, XML-File ?, ...).

Таким образом, шаблон проектирования итератора делает конкретную реализацию взаимозаменяемой без изменения кода клиентов.

Кроме того, вы можете написать свои собственные реализации итератора без каких-либо ограничений, что является самым важным преимуществом объявления Iterator как интерфейса. Например, вы можете написать Iterator, выполнить итерацию по определенной таблице базы данных или перебрать строки текста.

Google для «шаблона проектирования итератора», чтобы получить дополнительную информацию о его преимуществах (и недостатках) и его использовании.

С уважением, Боб

Смежные вопросы