Начинаем программировать на языке Java


Интерфейсы - часть 2


  • если несколько классов должны реализовать некий общий набор методов;
  • если требуется создать интерфейс без раскрытия деталей реализации класса.
  • Интерфейсы описываются по такой схеме:

    public interface CustomLook { public abstract void NotifyStartPaint(); public abstract void CustomPaint (); }

    После того как интерфейс декларирован, его имя можно использовать наряду со стандартными типами и классами. Возвращаясь к примеру создания элементов пользовательского интерфейса с новым внешним видом, можно сказать, что вы имеете право создавать переменные типа CustomLook. Возникает интересная возможность: вы можете хранить в массиве элементов CustomLook любые классы, унаследованные от него (полиморфизм), и передавать эти классы в качестве параметра типа CustomLook, иначе говоря, приводить их к типу базового интерфейса, не теряя при этом их особенностей. И все это можно проделывать для классов, никак не связанных в рамках иерархии. Разве такое возможно в Си++?

    Для облегчения понимания рассмотрим простой пример - создание элементов пользовательского интерфейса нестандартного вида. Сначала уточним задачу. Имеются несколько стандартных элементов интерфейса пользователя: кнопка (OldButton), строка ввода (OldInputLine) и пункт меню (OldMenuItem). Все эти элементы унаследованы от разных классов, никак не связанных между собой. Требуется создать на базе указанных выше элементов новые, отличающиеся по внешнему виду. Для этого нам потребуется, чтобы каждый новый элемент установил метод, отслеживающий начало рисования элемента на экране NotifyStartPaint, и новый метод рисования своего интерфейса CustomPaint. Оформим все новые требования как интерфейс CustomLook:

    public interface CustomLook { public abstract void NotifyStartPaint(); public abstract void CustomPaint (); }

    На базе интерфейса CustomLook и старых элементов мы создаем новые элементы: кнопку (NewButton), строку ввода (NewInputLine) и пункт меню (NewMenuItem). Вот окончательный вариант каркаса программы:

    public class NewButton extends OldButton implements CustomLook { public void NotifyStartPaint() { // Код для перехвата начала рисования } public void CustomPaint (); } { // Код для рисования кнопки нового // внешнего вида } }




    Начало  Назад  Вперед