Главная » Java » Правила применения интерфейсов

0

Интерфейс определяет тип с абстрактным контрактом. Абстрактный класс также определяет тип с абстрактным контрактом. Что именно – интерфейс или абстрактный класс – и когда именно следует использовать в каждом конкретном случае?

Существуют два главных различия между интерфейсами и абстрактными классами:

·      интерфейсы обеспечивают инструментарий множественного наследования, и производный класс способен наследовать одновременно несколько интерфейсов; классу же позволено расширять единственный базовый класс, даже если такой класс содержит только абстрактные методы;

·      абстрактный класс может быть частично реализован, он вправе содержать члены, помеченные как protected и/или statiс, и Т.п., В то время как структура интерфейса ограничена объявлениями public-констант и public-методов без какой бы то ни было реализации.

Указанные различия обычно обусловливают выбор средств, наиболее предпочтительных в конкретных обстоятельствах. Если возможность множественного наследования важна или просто полезна, следует обратиться к интерфейсам. Абстрактные классы, однако, предлагают реализацию – частичную или даже полную, – и поэтому цель может быть достигнута посредством простого наследования вместо необходимости реализации "с нуля" или использования схем композиции. Кроме того, абстрактный класс способен управлять реализацией некоторых методов, обозначая их как final. Например, рассмотренный в Главе 3 класс SortDoubl е гарантирует, что процедура сортировки будет использовать корректный объект типа SortMetrics, предназначенный для хранения результатов тестирования. Впрочем, если в процессе создания абстрактного класса выяснится, что все его методы должны быть абстрактными, вы невольно придете к модели интерфейса.

Любой мало-мальски серьезный класс – неважно, абстрактный или нет, который, как вы предполагаете, будет наследоваться, должен обеспечивать реализацию некоего интерфейса. Хотя подобный подход требует несколько больших усилий с вашей стороны, он открывает целую сферу новых применений класса, которая в противном случае окажется недоступной. Предположим, например, что вместо интерфейса Attributed с реализующим его классом AttributedImpl мы создали просто класс Attributed. в этом случае Программист, который хочет создавать новые классы, расширяющие другие существующие классы, никогда не сможет воспользоваться нашим Attributed, поскольку разрешается наследовать только один класс (в такой ситуации нельзя было бы создать и класс AttributedBody. Но если Attributed представлен в Форме интерфейса, у программиста есть выбор: он может расширить класс AttributedImpl и избежать необходимости обращения к средствам композиции либо, если по каким-то причинам это не удается, воспользоваться в крайнем случае и схемами композиции. Наконец, если предложенная вами реализация неверна или не отвечает конкретным требованиям, нетрудно заменить ее другой. (А вы как автор интерфейса, предвидя подобные проблемы, можете заранее создать несколько различных его реализаций.) Независимо от выбранной программистом стратегии, все создаваемые объекты будут относиться к типу Attributed

Упражнение 4.1. Вновь выполните упражнение 3.6 главы 3, используя средства объявления интерфейсов (разумеется, если вы не сделали этого раньше).

Упражнение 4.2. Предложите еще одно решение упражнения 3.12 главы 3, применив объявление интерфейса

Упражнение 4.3. Следует ли объявить ранее рассмотренный класс LinkedList как интерфейс? Рассмотрите подобный вариант совместно с соответствующим реализующим классом

Упражнение 4.4. Спроектируйте иерархию классов коллекций, используя только интерфейсные типы.

Упражнение 4.5. Подумайте, каким образом следует представить указанные ниже типы – в виде интерфейсов, абстрактных классов или конкретных классов: (1) TreeNode – для описания вершин N-арного дерева; (2) Treewalker для перемещения по дереву в соответствии с определенным порядком (таким как, например, "первый в глубину" или "первый в ширину"); (3) Drawablе для описания объектов, которые допускают отображение графической системой; (4) Application – для представления программных приложений, которые могут быть запущены на выполнение с графической консоли.

Упражнение 4.6. Какие возможные изменения в условиях задач, перечисленных в упражнении 4.5, способны повлиять на ваши ответы?

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии