Главная » Java » Интерфейсы Java

0

Иногда в ходе проектирования возникает потребность в том, чтобы объявить Методы, которые должны поддерживаться объектами класса, не предлагая конкретной реализации этих методов: в такой ситуации важно просто обеспечить гарантии того, что поведение объектов класса удовлетворяет совокупности некоторых критериев (ее принято называть контрактом), - детали реализации методов до определенного момента не важны. В каждом подобном объявлении Должна быть оговорена сигнатура метода и тип возвращаемого им значения, Чтобы любой класс, реализующий этот метод, подчинялся предложенному вами Контракту. Например, метод предназначен для поиска заданного объекта в некотором множестве объектов определенного типа – вас пока не интересует, каким именно образом организовано множество, к которому должен обращаться этот метод. Ваша настоящая цель состоит в том, чтобы будущие реальные версии метода одинаково успешно справлялись со связанным списком, хеш-таблицей либо любой другой структурой данных.

Для практического воплощения подобной модели действий язык программирования Java предусматривает средства определения интерфейсов. Интерфейсы подобны Классам, но содержат только заголовки (не полные объявления!) методов. Разработчик интерфейса предусматривает методы, которые должны поддерживаться классами, реализующими интерфейс, и оговаривает назначение каждого из методов. Ниже приведен пример интерфейса Lookup, содержащего метод, который Должен обеспечить функции поиска строкового значения в массиве объектов.

interface Lookup {

/** возвращает значение, соответствующее  содержимому name, либо null,

* если значение не найдено */

object find(string name);

}

В интерфейсе Lookup определен единственный метод, find, который принимает в качестве параметра объект типа String и возвращает значение, соответствующее содержимому переданной строки, либо null, если значение не найдено. Метод, объявленный в интерфейсе, лишен блока тела – ответственность за его практическую реализацию возлагается на производный класс – и поэтому вместо тела метода вводится просто символ точки с запятой. Код, в котором используются ссылки типа Lookup (ссылки на объекты классов, реализующих интерфейс Lookup), способен вызывать метод find и получать конкретные результаты независимо от действительного типа объектов:

void processvalues(String[] names, Lookup table) {

                              for (int i = 0; i < names.length; i++) {

                                          object va1ue = table.find(names[i]);

                                          if (value != null)

                                                                  processvalue(names[i], value);

                              }

                   }

Класс может одновременно реализовать столько интерфейсов, сколько необходимо. Класс, рассмотренный в следующем примере, реализует (implements) интерфейс Lookup, используя простые массивы (для краткости мы опустили описания методов, ответственных за ввод и удаление данных).

class SimpleLookup implements Lookup {

       private String[] names;

       private Object[] values;

       public Object find(String name) {

                   for (int i = 0; i < names.length; i++) {

                              if (names[i].equals(name))

                                          return values[i];

                   }

                   return null; // Значение не найдено

       }

       // …

}

В интерфейсе могут присутствовать объявления именованных констант, снабженные модификаторами statiс и final. Кроме того, в теле интерфейса допустимо объявлять другие, вложенные, интерфейсы и даже классы. Более подробные сведения о вложенных типах приведены в главе 5. Все члены интерфейса обладают признаком publiс, задаваемым явно или устанавливаемым косвенно, поэтому свободное обращение к ним разрешено во всех случаях, когда открыт для доступа сам интерфейс.

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

Базовыми типами (supertypes) класса называют все классы, которые тот расширяет, и интерфейсы, которые реализует, включая и базовые классы и интерфейсы более высоких уровней. В этом смысле объект следует рассматривать как экземпляр определенного класса, а также всех базовых классов, в том числе и интерфейсов. Объект может быть использован полиморфным образом по отношению к любым его базовым классам и интерфейсам всех возможных уровней.

Упражнение 1.14. Разработайте интерфейс, который расширяет интерфейс Lookup посредством объявления методов add и remove, предусматривающих возможность ввода и удаления данных соответственно. Реализуйте расширенный интерфейс в новом производном классе.

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

По теме:

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