2016-12-29 8 views
0

Я хочу создать класс, который просто переадресует вызов функции каждому элементу в списке, который он содержит. Вызываемые функции объявлены в интерфейсе Так, например (псевдо-код):функции прямого вызова ко всем элементам списка

ListObjectForwarder<InterfaceFoo> interfaceFooForwarder; 
interfaceFooForwarder.foo1(3,4); 

должно привести следующий код:

foreach object in list 
    object.foo1(3,4); 

и вызов

interfaceFooForwarder.foo2("hello"); 

должно привести в

foreach object in list 
    object.foo2("hello"); 

Итак, как вы видите: шаблон для того, как должны вызывать вызовы, всегда представляет собой цикл foreach с тем же самым вызовом и параметром. Переадресация вызовов ограничена данным интерфейсом (здесь InterfaceFoo - или egInterfaceBar)

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

Как я мог сделать что-то подобное на Java? Думаю, мне нужны делегаты (?), Но я не могу понять, как правильно их применить здесь.

редактировать:

Я не хотел бы реализовать foo1 и foo2 отдельно. Цель состоит в том, чтобы сказать, машина сразу «приходит вызов любой функции, сделать это на все элементы в списке»

Кроме того, я буду считать, что каждая функция возвращает пустоту

ответ

0

, если я правильно понял ваш вопрос:

class yourList<T>{ 

    List<T> list = new LinkedList<>(); 

    void generic(String methodName, Object...args){ 
     for (Object obj: list) { 
      try { 

       Class<?>[] classes = new Class<?>[args.length]; 
       for (int i = 0; i < args.length; i++) { 
        classes[i] = args[i].getClass(); 
       } 
       Method mtd = obj.getClass().getMethod(methodName, classes); 
       mtd.invoke(obj, args); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

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

Надеются, что это поможет в качестве отправной точки

+0

@ TheTrowser имеет смысл? – Lino

+0

Извините, я не объяснил это достаточно хорошо. Я обновил вопрос: я бы не хотел специально реализовывать foo1 и foo2. Скорее что-то похожее на общий вызов функции с общим телом – TheTrowser

+0

Это хорошая отправная точка! Спасибо! – TheTrowser

Смежные вопросы