АБОБА. Справочник по программированию на Java Методическое пособие
Скачать 242.41 Kb.
|
Частичные реализацииЕсли класс содержит интерфейс, но не полностью реализует определенные им методы, он должен быть объявлен как abstract (абстрактный). Например: abstract class Incomplete implements Callback { int a, b; void show() { System.out.println(a + " " + b); } // ... } В этом примере класс Incomplete не реализует метод callback() и должен быть объявлен как абстрактный. Любой класс, который наследует Incomplete, должен реализовать метод callback() либо быть также объявленным как abstract. Вложенные интерфейсыИнтерфейс может быть объявлен членом класса или другого интерфейса. Такой интерфейс называется интерфейсом-членом или вложенным интерфейсом. Вложенный интерфейс может быть объявлен как public, private или protected. Это отличает его от интерфейса верхнего уровня, который должен быть либо объявлен как public, либо, как уже было отмечено, должен использовать уровень доступа, заданный по умолчанию. Когда вложенный интерфейс используется вне содержащей его области определения, он должен определяться именем класса или интерфейса, членом которого он является. То есть вне класса или интерфейса, в котором объявлен вложенный интерфейс, его имя должно быть полностью определено. Переменные в интерфейсахИнтерфейсы можно применять для импорта совместно используемых констант в несколько классов посредством простого объявления интерфейса, который содержит переменные, инициализированные нужными значениями. При включении интерфейса в класс (т.е. при “реализации” интерфейса) имена всех этих переменных будут помещены в область констант. (Это аналогично использованию в программе C/C++ заголовочного файла для создания большого числа констант типа #define или объявлений const.) Если интерфейс не содержит никаких методов, любой класс, который включает в себя такой интерфейс, в действительности ничего не реализует. Это равносильно тому, что класс импортировал бы постоянные поля в пространство имен класса в качестве переменных типа final. В следующем примере эта технология применяется для реализации автоматизированной “системы принятия решений”. import java.util.Random; interface SharedConstants { int NO = 0; int YES = 1; int MAYBE = 2; int LATER = 3; int SOON = 4; int NEVER = 5; } class Question implements SharedConstants { Random rand = new Random(); int ask() { int prob = (int) (100 * rand.nextDouble()); if (prob < 30) return NO; // 30% else if (prob < 60) return YES; // 30% else if (prob < 75) return LATER; // 15% else if (prob < 98) return SOON; // 13% else return NEVER; // 2% } } class AskMe implements SharedConstants { static void answer(int result) { switch(result) { case NO: System.out.println("Нет"); break; case YES: System.out.println("Да"); break; case MAYBE: System.out.println("Возможно"); break; case LATER: System.out.println("Позднее"); break; case SOON: System.out.println("Вскоре"); break; case NEVER: System.out.println("Никогда"); break; } } public static void main(String args[]) { Question q = new Question(); answer(q.ask()); answer(q.ask()); answer(q.ask()); answer(q.ask()); } } Обратите внимание, что в этой программе использован один из стандартных Javaклассов – Random. Этот класс генерирует псевдослучайные числа. Он содержит несколько методов, которые позволяют получать случайные числа в требуемой программой форме. В этом примере применяется метод nextDouble(), который возвращает случайные числа в диапазоне от 0,0 до 1,0. В приведенном примере программы два класса Question и AskMe реализуют интерфейс SharedConstants, в котором определены константы NO (Нет), YES (Да), MAYBE (Возможно), SOON (Вскоре), LATER (Позднее) и NEVER (Никогда). Код внутри каждого класса ссылается на эти константы так, как если бы каждый класс определял или наследовал их непосредственно. Возможность расширения интерфейсовКлючевое слово extends позволяет одному интерфейсу наследовать другой. Синтаксис определения такого наследования аналогичен синтаксису наследования классов. Когда класс реализует интерфейс, который наследует другой интерфейс, он должен предоставлять реализации всех методов, определенных внутри цепочки наследования интерфейса. |