Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Интефейсы


Автор: Гость_Novice 3.3.2004, 15:58
Подскажите плиз зачем нужны интерфейсы confused.gif
кроиме как для мнодественнго наследования confused.gif
не понимаю я !!! sad.gif

Автор: Nobody 3.3.2004, 21:22
Вот для него-то они и нужны =)

Автор: Sun 4.3.2004, 11:53
Интерфейсы нужны не для множественного наследования (которого в Java на самом деле нет), а для организации позднего связывания (поллиморфизма). Интерфейс представляет собой не сам класс, а лишь описание его методов. На базе интерфейса создаются классы, реализующие эти методы. В результате мы можем получить набор классов выполняющих разную работу, но имеющие один интерфейс (набор методов).

Интерфейсы Java можно сравнить с интерфейсами аппаратными. Например к PCI интерфейсу компьютера мы можем подключать различные, не похожие друг на друга устройства - видеокарты, звуковые карты, модемы. У этих устройств нет почти ничего общего и выполняют они разные функции, но подключить их все можно к PCI интерфейсу.

Автор: Unregistered 5.3.2004, 01:26
Спасибо большое Sun !!! за исчерпывающий ответ !

Автор: Unregistered 5.3.2004, 01:30
Цитата
)
Интерфейс представляет собой не сам класс, а лишь описание его методов. На базе интерфейса создаются классы, реализующие эти методы


А зачем ? если мы просто создадим класс с такимиже методами без имплементации что изменется confused.gif

Цитата

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


Зачем confused.gif множе просто использовать наследование и добиться тогоже


Автор: Sun 5.3.2004, 11:50
Интерфейсы улучшают планирование будущей системы или библиотеки классов. Можно взять в качестве примера интерфейс java.util.List. Его методы описывают типичное поведение списков, такие как add(), remove(), get(). На основе этого интерфейса мы можем реализовать классы с различным поведением, но имеющию одинаковый интерфейс. В результате мы можем в вызове какой-нибудь функции объявить параметр типа List, а передавать в него ArrayList, LinkedList, Vector.

При грамотном построении системы сначала идет ее планирование. На этом этапе закладывается идеология будушей системы, устанавливаются связи между объектами. На этом этапе как раз можно объявить интерфейсы. Фактически это работа системного аналитика и проектировщика. Они создают план, по которому будет строиться будущая система, а уже непосредственно реализацию будут выполнять программисты. Интерфейсы это просто более высокий уровень абстракции, они сродни чистым виртуальным классам в C++.

Автор: breeezy 10.3.2004, 09:00
Цитата
Зачем  множе просто использовать наследование и добиться тогоже

Уточнение.
Наследоваться (extends) можно только от одного класса,
а выполнять (implements) интерфейсов - сколько хочешь!

Автор: Wowa 8.12.2005, 23:22
Может кто-нибудь привести краткий и наглядный пример ввиде кода, где используется интерфейс?

Автор: batigoal 8.12.2005, 23:43
Рыба и лодка - совершенно разноплановые объекты, но они могут плавать. Допустим, нам нужно создать список плавающих объектов. Объединять в иерархию нелогично - общих черт нет. Используем интерфейс:

Код

public interface Swimable
{
  public void swim();
}

class Boat
{
  ...
  public void swim()
  {
    ...
  }
  ...
}

class Fish
{
  ...
  public void swim()
  {
    ...
  }
  ...
}

class Main
{
  ...
  public void makeSwimableList()
  {
    ArrayList<Swimable> list = new ArrayList<Swimable>();
    list.add(new Fish());
    list.add(new Boat());

    ...

   Iterator iterator = list.getIterator();
   while(iterator.hasNext())
   {
      iterator.next().swim();
   }
  }
  ...
}


В коде мог и напотрачить - не проверял, да и не пользовался я еще никогда пятеркой smile

Автор: Wowa 8.12.2005, 23:51
А что делает эта строчка: iterator.next().swim(); ? Вызывает интерфейс или сразу метод класса? И почему iterator.next(), а не iterator.current() ?

Автор: LSD 8.12.2005, 23:59
Цитата(Wowa @ 8.12.2005, 23:51)
А что делает эта строчка: iterator.next().swim(); ?

Получает следующий элемент и вызывает у него метод swim().

Цитата(Wowa @ 8.12.2005, 23:51)
Вызывает интерфейс или сразу метод класса?

Метод реального объекта, или его предка если в этом объекте он не переопределен.


Цитата(Wowa @ 8.12.2005, 23:51)
И почему iterator.next(), а не iterator.current() ?

Метода current() нет, только next() и hasNext(). Итератор позволяет только один раз пройтись по коллекции.

Автор: Wowa 9.12.2005, 00:07
Цитата

Метода current() нет, только next() и hasNext(). Итератор позволяет только один раз пройтись по коллекции.

Понятно, спасибо.



А вот, что касается интерфейса, то чего-то все равно непонятно, для чего мы создали интерфейс Swimable.

Автор: batigoal 9.12.2005, 00:16
Цитата(Wowa @ 9.12.2005, 01:07)
А вот, что касается интерфейса, то чего-то все равно непонятно, для чего мы создали интерфейс Swimable.

Потому что иначе мы не смогли бы сделать список из объектов разных классов. Ведь тогда тебе пришлось бы извлекать объект из коллекции и приводить его к типу... а неизвестно какому типу: Boat или Fish. А так, мы можем просто указать: объекты такого-то, такого-то и такого-то класса не похожи, но все они могут быть охарактеризованы, как плавающие.

То же самое можно было сделать, унаследовав их от абстрактного класса Swimables, например. Но интерфейсы более логичны. К тому же, класс не может наследовать нескольким классам. А вот несколько интерфейсов реализовывать может. Например, "плавающий" и "летающий". И потом ты, допустим, сделаешь иерархию транспортных средств, и укажешь всем самолетам, что они "летающие". А гидропланы - еще и "плавающие".

Автор: Wowa 9.12.2005, 00:28
Цитата(Lamer @ 8.12.2005, 22:16)
А вот несколько интерфейсов реализовывать может. Например, "плавающий" и "летающий". И потом ты, допустим, сделаешь иерархию транспортных средств, и укажешь всем самолетам, что они "летающие". А гидропланы - еще и "плавающие".

можно пример? smile

Автор: batigoal 9.12.2005, 00:30
Цитата(Wowa @ 9.12.2005, 01:28)
можно пример?

Можно... но завтра (мне через пять часов на работу идти smile )
Может, чего-нибудь попрактичней придумаю.

Автор: LSD 9.12.2005, 00:35
В зависимости от того какой параметр нам передали, мы выполняем разный код. Но сам код main не меняется.
Код
public class MyEventProducer
{
  public static void main(String[] args)
  {
    getDefaultAction(args[0]).doAction("Hello Word!");
  }
  
  private static Action getDefaultAction(String type)
  {
    if("GUI".equals(type))
      return new GuiHelloWordAction();
    else
      return new ConsoleHelloWordAction();
  }
}

interface Action
{
  public void doAction(String command);
}

class ConsoleHelloWordAction implements Action
{
  public void doAction(String command)
  {
    System.out.println(command);
  }
}

class GuiHelloWordAction implements Action
{
  public void doAction(String command)
  {
    JOptionPane.showMessageDialog(null, command);
  }
}

Автор: Wowa 9.12.2005, 00:44
Я добавил в ФАК статью про интерфейсы: http://vingrad.ru/JAVA-ART-002984

Автор: COVD 9.12.2005, 18:15
Цитата
привести краткий и наглядный пример ввиде кода, где используется интерфейс


Примеров может быть много.

Программисты А и Б делают проект School. Программист А пишет класс Course, программист Б пишет класс Student. Программист А , не дожидаясь, пока будет готов класс Student, пишет метод setStudent(IStudent student) и создает интерфейс IStudent с нужным ему методом getName(). Программист А передает этот интерфейс программисту Б и говорит, что его класс Student должен имплементировать этот интерфейс, т.е. класс может быть каким угодно и называться как угодно, лишь бы он имел метод getName().

Автор: Wowa 11.1.2006, 23:35
Цитата(COVD @ 9.12.2005, 16:15 Найти цитируемый пост)

Программист А передает этот интерфейс программисту Б и говорит, что его класс Student должен имплементировать этот интерфейс, т.е. класс может быть каким угодно и называться как угодно, лишь бы он имел метод getName().

Но ведь Программист А может попросить программиста Б реализовать в своем классе метод string public getName(). Зачем делать через инферфейс? ИМХО, этот пример плохо подходит...

Автор: COVD 11.1.2006, 23:57
Но ведь Программист А может попросить программиста Б

а если не может? если они вообще в разных странах работают и друг друга не знают smile . А интерфейс - это документ.

Пример может и плохой/ Хорошие примеры у преподавателей, у тех, чья профессия обьяснять smile.

Это иллюзия, что прочитав книжку можно все понять. Поймешь, когда будешь решать проблему для решения которой интерфейсы и придуманы. С другой стороны, можно много лет программировать и чего-то не знать. Тоже не беда.

Автор: GIK 12.1.2006, 13:57
Цитата

Поймешь, когда будешь решать проблему для решения которой интерфейсы и придуманы.


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

Посудите сами
Пример:
Код

 interface Int1 {  
  int g1();  
  void g2();
}
 class Fix1 implements Int1{
  int tos;  
   //методы определенные в интерфейсе, без них нельзя т.к. класс не абстрактный.
 int g1(){  
 tos++;
 return(tos);
 }
   void g2(){
System.out.println(tos);
    }
   }
 class DemoInt1 {
 pablic static void main(String args[]){
  Int1 int1; //сылочная переменная на интерфейс
  Fix1 fix1 = new Fix1(); // просто экземпляр класса который реализует интерфейс
  int1 = fix1; //загрузка происходит во время выполнения а не во время компиляции
 }
}


А так можно просто обращатся к методам которые определены в том или ином объекте.
Код

class Fix1 {
 int tos=0;  
  int g1(){  
 tos++;
 return(tos);
 }
   void g2(){
System.out.println(tos);
 }
}
 class DemoInt1 {
 pablic static void main(String args[]){
  Fix1 fix1 = new Fix1(); 
    System.out.println(fix1.g1());
    fix1.g2();}
}

Автор: batigoal 12.1.2006, 14:22
GIK
Советую: делай отступы в коде побольше, не один пробел, а два-четыре. Читать будет легче.

Автор: LSD 12.1.2006, 14:23
Цитата(GIK @ 12.1.2006, 13:57 Найти цитируемый пост)
Главное что я понял в интерфейсах, это то что с помощъю них можно реализовать
полиморфизм времени выполнения

Нет. С их помощью можно реализовать множественное наследование. Это будет урезанный вариант, по сравнению с множественным наследованием в C++ или других языках, но по некоторым соображениям этот вариант предпочтительней.

Интерфейс нужен для абстрагирования реализации от задачи. Возьмем пример обработки события на кнопке. Есть задача оповестить всех заинтересованные классы о том, что произошло событие, для этого в интерфейсе ActionListener предусмотрен метод actionPerformed(ActionEvent). И оговорено что любой кто желает получать оповещения, о том что любой кто желает получать оповещения о том что кнопка была нажата, должен реализовать этот интерфейс, опрделив в методе actionPerformed(ActionEvent) свою логику, и зарегистрировать свой объект в качстве слушателя. У кнопки храниться список ActionListener-ов и когда происходит нажатие на кнопу, у каждого вызывается метод actionPerformed(ActionEvent). Таким образом в классе кнопки не надо думать о том: какие классы могут подписываться на данное событие, какие методы у этих классов есть, что эти методы делаю и т.д. Достаточно определть интефейс и сказать что слушателям надо его реализовать, и все.

Автор: COVD 12.1.2006, 16:04
Цитата

Главное что я понял в интерфейсах, это то что с помощъю них можно реализовать
полиморфизм времени выполнения


Офигеть smile Не заморачивайтесь так сильно. Без интерфейсов вполне можно обойтись первое время. И без классов тоже, если писать весь код в main. Программа даже быстрее будет работать. Только ее труднее будет писать, тестировать и вносить изменения. Все эти обьектно-ориентированные понятия введены, чтобы упростить жизнь программистам (а на самом деле тем, кто платит им зарплату smile).


Автор: AntonioBanderaz 12.1.2006, 18:38
Цитата(COVD @ 12.1.2006, 16:04 Найти цитируемый пост)

Офигеть  Не заморачивайтесь так сильно. Без интерфейсов вполне можно обойтись первое время. И без классов тоже, если писать весь код в main. Программа даже быстрее будет работать. Только ее труднее будет писать, тестировать и вносить изменения. Все эти обьектно-ориентированные понятия введены, чтобы упростить жизнь программистам (а на самом деле тем, кто платит им зарплату ).

Пиши тогда на Assembler'е smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)