Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интерфейсы 
:(
    Опции темы
Wowa
Дата 9.12.2005, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: 1
Всего: 290



Java предоставляет программисту еще одно средство, родственное классам, - интерфейсы. Интерфейс - это набор абстрактных методов, которые не содержат никакого кода. По своему предназначению интерфейсы похожи на абстрактные классы, хотя между ними имеются некоторые существенные различия. Так, например, интерфейсы, в отличие от абстрактных классов, могут быть только public или  private. Методы, описанные внутри интерфейсов, всегда доступны (public) и абстрактны (abstract). Данные, декларированные в интерфейсе, изначально имеют атрибуты final, public и static, т. е. неизменяемы. Иногда это удобно, а иногда накладывает серьезные ограничения на применение интерфейсов. Но тут уж ничего не поделаешь - таковы правила языка. Интерфейсы дают возможность программисту описывать наборы методов, которые должен реализовать класс. К примеру, стандартный интерфейс для создания многопоточных приложений Runnable задается следующим образом: 

  
Код

shape[0].Draw(); // Вызывает Point.Draw(); 

shape[1].Draw(); // Вызывает Circle.Draw(); 

shape[2].Draw(); // Вызывает Square.Draw(); 

  

    Данное описание устанавливает прототип для метода Run, необходимого для запуска нового потока выполнения. Для того чтобы использовать интерфейсы, от них должен быть унаследован класс, который реализует все шаблоны абстрактных методов, определенных в интерфейсе. Это можно сделать, использовав ключевое слово implements. Так, описание класса потока может выглядеть следующим образом: 

Код

public NewThread implements Runnable 



public void run() 



      // Здесь запускается новый поток 

      // выполнения 





  

    Обратите внимание: ключевое слово implements (реализует) стоит в том месте, где обычно располагается ключевое слово extends, описывающее отношение наследования. Но встречаются и случаи, когда какой-нибудь класс наследует методы другого класса и одновременно реализует какой-нибудь интерфейс: 

  
Код

public class MyApplet extends Applet implements Runnable 


  
    После такого упрощенного введения позволю себе описать понятия и синтаксис интерфейсов снова, но уже более формально. Итак, как уже было сказано, интерфейс - это набор описаний методов без реализации и констант. Такое средство может понадобиться для организации наследования из любого места иерархии. Описав, к примеру, интерфейс CustomLook с методом CustomPaint для создания элементов интерфейса с новым внешним видом, мы можем создавать по-новому выглядящие элементы на базе стандартных. При этом можно с одинаковым успехом создать на базе интерфейса CustomLook новый вид кнопки или новую строку ввода, и при этом

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

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

  
Код

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 (); 




// Код для рисования кнопки нового 

// внешнего вида 





  

public class NewInputLine extends OldInputLine implements CustomLook 



public void NotifyStartPaint() 



// Код для перехвата начала рисования 



public void CustomPaint (); 





// Код для рисования строки ввода 

// нового внешнего вида 





  

public class NewMenuItem extends OldMenuItem implements CustomLook 



public void NotifyStartPaint() 



// Код для перехвата начала рисования 



public void CustomPaint (); 





// Код для рисования пункта меню нового 

// внешнего вида 





  

    Таким образом, мы получили новые классы, как и раньше, не связанные между собой, но имеющие одинаковую функциональность. Их можно сохранить в массиве элементов типа CustomLook, несмотря на то, что все они имеют разных предков. Кратко напомним ключевые моменты использования интерфейсов: программы, выполненные на языке Java, могут использовать интерфейсы, если нежелательно использование общего предка или добавление новых методов к общему абстрактному классу-предку Object; переменные типа какого-либо интерфейса могут содержать ссылки на классы, унаследованные от этого интерфейса; недостаточно, чтобы класс реализовал методы интерфейса; кроме того, из описания должно быть ясно, что класс представляет собой реализацию некоего интерфейса, иначе считается, что этот класс не реализует интерфейс; если класс, который наследует интерфейс, не полностью реализует набор его методов, он становится абстрактным и к нему применимы все правила для

абстрактных классов.

PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.