Полиморфизм и интерфейсы в Java (можно ли использовать полиморфизм для реализации интерфейсов ... почему?) - PullRequest
3 голосов
/ 24 марта 2011

В реальном мире, для чего люди используют это (для решения каких типов проблем)?Могу ли я увидеть пример кода, работающего вместе?Все, что я могу найти, это код о говорящих кошках и собаках или людях, пьющих молоко или кофе ...

Реализуют ли люди полиморфизм с интерфейсами?Для чего?

Ответы [ 8 ]

12 голосов
/ 24 марта 2011

Конечно,

Ниже приведен конкретный пример шаблона «Наблюдатель», использующего классы и интерфейсы для реализации полиморфного поведения в системе ведения журнала:

interface ILogger{

   public void handleEvent (String event);
}

class FileLogger implements ILogger{

   public void handleEvent (String event){
       //write to file
   }
}

class ConsoleLogger implements ILogger{

   public void handleEvent (String event){
       System.out.println( event );
   }
}

class Log {

   public void registerLogger (ILogger logger){

       listeners.add(logger);
   }

   public void log (String event){

       foreach (ILogger logger in listeners){

            logger.handleEvent(event); //pass the log string to both ConsoleLogger and FileLogger!
       }
   }

   private ArrayList<ILogger> listeners;
}

Тогда вы можете использовать его следующим образом:

public static void main(String [] args){

     Log myLog();
     FileLogger myFile();
     ConsoleLogger myConsole();

     myLog.registerLogger( myFile );    
     myLog.registerLogger( myConsole );

    myLog.log("Hello World!!");
    myLog.log("Second log event!");
}

Надеюсь, это поможет вам понять интерфейсы и полиморфизм.

7 голосов
/ 24 марта 2011
Map<String,Person> peopleByName = new HashMap<String,Person>();

Если в будущем я решу, что служебная память HashMap слишком велика, я могу сделать это в виде TreeMap и жить с немного более дорогим временем поиска

Map<String,Person> peopleByName = new TreeMap<String,Person>();

Поскольку peopleByName - это Карта, а не TreeMap или HashMap, все мои вызовы гарантированно будут работать на любой карте независимо от реализации.

Это лучше всего иллюстрируется на следующем примере

public class CatsAndDogsDrinkingMilkAndCoffee {

   // what, no? :-(

}
4 голосов
/ 24 марта 2011
interface Request {
  Response execute();
}
interface Response {
  String serialize();
}
class RequestProcessor {
  void processRequest(Request r) {
    logger.log("Request: " + r);
    Response s = r.execute();
    logger.log("Response: " + s);
    connectionManager.write(r.serialize());
  }
}

Скажем, в этом примере RequestProcesor не нужно знать о реализации запросов и ответов

1 голос
/ 24 марта 2011

Еще одно предложение для «реального мира» - использование весенней партии.Если у вас есть широко используемый формат отчета, который следует шаблону типа «извлекать данные, создавать отчет, отправлять получателям», вы можете создать интерфейс для отчетов, который обеспечивает соблюдение этого стандарта.В этом смысле он работает как «шаблон», которому будут следовать все пакетные отчеты.

Скучный пример, но я столкнулся с этим на первом курсе ...

1 голос
/ 24 марта 2011

Практически любое приложение Java с GUI использует его (но, конечно, не только GUI ...).Например, посмотрите на источник android VideoView (это первое, что приходит мне в голову ...)

1 голос
/ 24 марта 2011

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

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

1 голос
/ 24 марта 2011

Взгляните на код для Map / AbstractMap / HashMap в качестве примера. Тысячи других примеров вы найдете в исходном коде JDK, который поставляется с JDK (в src.zip)

0 голосов
/ 07 мая 2012

Задумывались ли вы, как работает LINQ в .net? Все дело в интерфейсах и полиморфизме.

Вам нужно работать над проектами, тогда вы узнаете обо всем этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...