русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

InterfaceCollіsi on java:24- интерфейсы І1 и I1 несовместимы; оба определяют f(), но с различными возвращаемыми типами


Дата добавления: 2015-06-12; просмотров: 725; Нарушение авторских прав


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

 

Интерфейсы как средство адаптации

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

Соответственно, интерфейсы часто применяются в архитектурном паттерне «Стратегия». Вы пишете метод, выполняющий несколько операций; при вызове метод получает интерфейс, который тоже указываете вы. Фактически вы говорите: «Мой метод может использоваться с любым объектом, удовлетворяющим моему интерфейсу». Метод становится более гибким и универсальным.

Например, конструктор класса Java SE5 Scanner получает интерфейс Readable. Анализ показывает, что Readable не является аргументом любого другого метода из стандартной библиотеки Java — этот интерфейс создавался исключительно для Scanner, чтобы его аргументы не ограничивались определенным классом. При таком подходе можно заставить Scanner работать с другими типами. Если вы хотите создать новый класс, который может использоваться со Scanner, реализуйте в нем интерфейс Readable:

//: interfaces/RandomWords.java

// Реализация интерфейса для выполнения требований метода

import java.nio.*;

import java.util.*;

 

public class RandomWords implements Readable {

private static Random rand = new Random(47);

private static final char[] capitals =

"ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();

private static final char[] lowers =

"abcdefghijklmnopqrstuvwxyz".toCharArray();



private static final char[] vowels =

"aeiou".toCharArray();

private int count;

public RandomWords(int count) { this.count = count; }

public int read(CharBuffer cb) {

if(count-- == 0)

return -1; // Признак конца входных данных

cb.append(capitals[rand.nextInt(capitals.length)]);

for(int i = 0; i < 4; i++) {

cb.append(vowels[rand.nextInt(vowels.length)]);

cb.append(lowers[rand.nextInt(lowers.length)]);

}

cb.append(" ");

return 10; // Количество присоединенных символов

}

public static void main(String[] args) {

Scanner s = new Scanner(new RandomWords(10));

while(s.hasNext())

System.out.println(s.next());

}

}

<spoiler text="Output:">

Yazeruyac

Fowenucor

Goeazimom

Raeuuacio

Nuoadesiw

Hageaikux

Ruqicibui

Numasetih

Kuuuuozog

Waqizeyoy

</spoiler> Интерфейс Readable требует только присутствия метода read(). Метод read() либо добавляет данные в аргумент CharBuffer (это можно сделать несколькими способами; обращайтесь к документации CharBuffer), либо возвращает -1 при отсутствии входных данных.

Допустим, у нас имеется класс, не реализующий интерфейс Readable, — как заставить его работать с Scanner? Перед вами пример класса, генерирующего вещественные числа:

//: interfaces/RandomDoubles.java

import java.util.*;

 

public class RandomDoubles {

private static Random rand = new Random(47);

public double next() { return rand.nextDouble(); }

public static void main(String[] args) {

RandomDoubles rd = new RandomDoubles();

for(int i = 0; i < 7; i ++)

System.out.print(rd.next() + " ");

}

}

<spoiler text="Output:">

0.7271157860730044 0.5309454508634242

0.16020656493302599 0.18847866977771732 0.5166020801268457

0.2678662084200585 0.2613610344283964

</spoiler> Мы снова можем воспользоваться схемой адаптера, но на этот раз адаптируемый класс создается наследованием и реализацией интерфейса Readable. Псевдомножественное наследование, обеспечиваемое ключевым словом interface, позволяет создать новый класс, который одновременно является и RandomDoubles, и Readable:

//: interfaces/AdaptedRandomDoubles.java

// Создание адаптера посредством наследования

import java.nio.*;

import java.util.*;

 

public class AdaptedRandomDoubles extends RandomDoubles

implements Readable {

private int count;

public AdaptedRandomDoubles(int count) {

this.count = count;

}

public int read(CharBuffer cb) {

if(count-- == 0)

return -1;

String result = Double.toString(next()) + " ";

cb.append(result);

return result.length();

}

public static void main(String[] args) {

Scanner s = new Scanner(new AdaptedRandomDoubles(7));

while(s.hasNextDouble())

System.out.print(s.nextDouble() + " ");

}

}

<spoiler text="Output:">

0.7271157860730044 0.5309454508634242

0.16020656493302599 0.18847866977771732 0.5166020801268457

0.2678662084200585 0.2613610344283964

</spoiler> Так как интерфейсы можно добавлять подобным образом только к существующим классам, это означает, что любой класс может быть адаптирован для метода, получающего интерфейс. В этом заключается преимущество интерфейсов перед классами.

 

Поля в интерфейсах



<== предыдущая лекция | следующая лекция ==>
Глава 9 ИНТЕРФЕЙСЫ | Инициализация полей интерфейсов


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.453 сек.