В моем проекте GWTQuery у меня есть ситуация, когда есть 4 настраиваемых раскрывающихся меню. Каждый раз, когда пользователь изменяет любой из текущего выбора меню, выполняется запрос AJAX со значениями 4 меню (одно из которых является вновь измененным значением этого меню). Поскольку все 4 меню запускают аналогичный запрос, я подумал, что напишу общий класс для обработки запроса AJAX, а затем позволю обработчикам кликов расширить этот класс.

Но тогда, когда меню генерируются динамически, мне приходится прибегать к методу GWTQuery live. И это принимает в качестве параметра переменную типа Function. Поскольку он уже расширяет функцию, я не могу заставить его расширять и мой класс обработчика Ajax. Так как мне это сделать? Что-то вроде этого я ищу:

class f extends Funnction, AJAX_Handler {
 public boolean f(Event e) {
  ...
  return true;
  }
 public void request(int i1,int i2,int i3,int i4) {
  //for handling the request, defined in the AJAX_Handler class
  ...
  }
 }

Одно дело: определить общий обработчик для всех 4 меню, которые содержат функции AJAX_handler, а затем определить, какое меню является текущим обработчиком, на который ссылается, - нет-нет. Класс AJAX_handler должен быть отдельным.

2
SexyBeast 22 Янв 2013 в 22:32

1 ответ

Лучший ответ

Вместо этого определите интерфейсы.

 public interface AJAX_Handler
 {
    public void request(int i1,int i2,int i3,int i4);

 }

Затем в вашем фактическом классе реализуйте определенный интерфейс.

 class f extends Funnction implements AJAX_Handler
 {
   public boolean f(Event e) {
      ...
    return true;
    }
   public void request(int i1,int i2,int i3,int i4) {
   //for handling the request, defined in the AJAX_Handler class
    ...
    }
  }

[РЕДАКТИРОВАТЬ] Учитывая, что вам нужно сохранить функциональность в одном и том же месте. Я думаю, что самым простым решением было бы определить интерфейс AJAX_Handler, а затем иметь реализованный класс. Например:

 public class AJAX_HandlerImpl implements AJAX_Handler
 {
    public void request(int i1,int i2,int i3,int i4){
         //do whats necessary
     }
 }

Затем используйте композицию в своем классе f. Что-то вроде:

 class f extends Funnction implements AJAX_Handler
 {
   private AJAX_HandlerImpl impl = new AJAX_HandlerImpl();

   public boolean f(Event e) {
      ...
    return true;
    }

   public void request(int i1,int i2,int i3,int i4) {
          impl.request(i1,i2,i3,i4);
    }
  }
1
Sednus 23 Янв 2013 в 00:03
Определение функции request довольно обширное и сложное. Так что, если я объявлю это просто как интерфейс, мне придется реализовать его полностью для всех 4 обработчиков, это именно то, чего я пытаюсь избежать ..
 – 
SexyBeast
22 Янв 2013 в 23:52
Я не вижу причины, почему бы этого не произошло. Но я думаю, вам придется узнать наверняка.
 – 
Sednus
23 Янв 2013 в 00:18
Да, это правда. Дай мне чек ... Но, тем не менее, это отличная идея, завтра обязательно награда ...
 – 
SexyBeast
23 Янв 2013 в 00:20
Вот это да. Работает как шарм! Большое спасибо, дружище! Завтра я награжу награду, наименьшее, что я могу сделать за такую ​​огромную помощь!
 – 
SexyBeast
23 Янв 2013 в 01:47