Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования JAVA.pdf
Скачиваний:
373
Добавлен:
02.05.2014
Размер:
2.57 Mб
Скачать

converted to PDF by BoJIoc

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

Перенаправление работает без особых хитростей и требует существенно меньших усилий, чем реализация Attributed “с нуля”. Кроме того, если в будущем появится более удачная реализация Attributed, вы сможете быстро перейти на нее.

4.6. Для чего применяются интерфейсы

Между интерфейсами и абстрактными классами существует два важных отличия:

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

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

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

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

Упражнение 4.1

Перепишите свое решение упражнения 3.7 с использованием интерфейса, если вы не сделали этого ранее.

Упражнение 4.2

Перепишите свое решение упражнения 3.12 с использованием интерфейса, если вы не сделали этого ранее.

Упражнение 4.3

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

Упражнение 4.4