русс | укр

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

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

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

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


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

Оператор implements


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


Для создания класса согласованного с некоторым интерфейсом (или группой интерфейсов) используется ключевое слово implements. При этом класс согласованный с интерфейсом является обычным и в последствии может быть унаследован. Методы, объявленные в интерфейсе, при реализации класса должны быть определены как public. В противном случае, они будут по умолчанию friendly и доступ к ним во время наследования запрещен компилятором.

import java.util.*;

interface Instrument {

int i = 5; // static & final

void play(); // автоматически public

String what();

void adjust();

}

 

class A implements Instrument {

public void play() {

System.out.println("Wind.play()");

}

public String what() { return "Wind"; }

public void adjust() {}

}

 

class B implements Instrument {

public void play() {

System.out.println("Percussion.play()");

}

public String what() { return "Percussion"; }

public void adjust() {}

}

 

class AA extends A {

public void play() {

System.out.println("Brass.play()");

}

public void adjust() {

System.out.println("Brass.adjust()");

}

}

 

class BB extends B {

public void play() {

System.out.println("Woodwind.play()");

}

public String what() { return "Woodwind"; }

}

 

public class Music {

static void tune(Instrument i) {

// ...

i.play();

}

static void tuneAll(Instrument[] e) {

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

tune(e[i]);

}

public static void main(String[] args) {

Instrument[] orchestra = new Instrument[4];

int i = 0;

// Приведение к базовому типу во время добавления в массив:

orchestra[i++] = new A();

orchestra[i++] = new B();

orchestra[i++] = new AA();

orchestra[i++] = new BB();



tuneAll(orchestra);

}

} ///:~

Можно создавать ссылки на интерфейсы. Конечно, указывать такая ссылка может только на какую-нибудь реализацию интерфейса. Тем самым мы получаем еще один способ организации полиморфизма. Как видно из примера, можно объявлять переменные как объектные ссылки для инициализации которых используется не тип класса, а интерфейсный тип. Такую переменную можно инициализировать ссылкой на объект любого класса реализующего данный интерфейс. Через такую ссылку можно вызывать верную версию метода (динамически), основываясь на актуальном экземпляре интерфейса. Через переменную интерфейсной ссылки можно обращаться только к методам, объявленным в интерфейсе и реализованным в классе. Ссылку нельзя использовать для обращения к частным методам класса.

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

import java.util.Random;

interface Const {

int NO = 0;

int YES = 1;

int MAYBE = 2;

int LATER = 3;

int SOON = 4;

int NEVER = 5;

}

 

class Question implements Const {

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 intr1 implements Const {

static void answer(int result)

{ switch(result)

{ case NO:

System.out.println("No");

break;

case YES:

System.out.println("Yes");

break;

case MAYBE:

System.out.println("Maybe");

break;

case LATER:

System.out.println("Later");

break;

case SOON:

System.out.println("Soon");

break;

case NEVER:

System.out.println("Never");

break;

}

}

public static void main(String args[])

{ Question q = new Question();

answer(q.ask());

answer(q.ask());

answer(q.ask());

answer(q.ask());

}

}

 



<== предыдущая лекция | следующая лекция ==>
Интерфейсы | Частичные реализации


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


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

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

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


 


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

 
 

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

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