2013-06-15 6 views
5

Мой класс реализует ActionListener. Я выполнил следующие вложенные классы ниже:Необходимо реализовать унаследованный абстрактный метод

JMenuItem mntmNew = new JMenuItem("New..."); 
    mntmNew.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      doNew(e); //calls to outer class for cleaner code 
     } 
    }); 
    mnFile.add(mntmNew); 

    JMenuItem mntmLoad = new JMenuItem("Load..."); 
    mntmLoad.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      doLoad(e); //calls to outer class for cleaner code 
     } 
    }); 
    mnFile.add(mntmLoad); 

//etc. for the rest of the menu system 

Однако, Eclipse все еще говорил мне, что мой класс должен реализовать унаследовали абстрактный метод ActionListener.actionPerformed (ActionEvent е). Не можете ли вы реализовать методы переопределения в вложенном классе таким образом?

+0

Даун-голос отменен с голосованием. Я не знаю, почему кто-то проголосовал за этот вопрос, поскольку он представляется мне действительным вопросом. –

+0

++ из-за ответа @ HovercraftFullOfEels :) – Azad

ответ

8

Ваш вопрос:

Вы можете не применять методы переопределения во вложенном классе таким образом?

Ответ нет. Затмение (на самом деле Java) жалуется, что в то время как вы объявить свой класс, как реализация ActionListener вы не давая необходимый actionPerformed(...) метода в собственной области видимости класса вашего класса - и это последняя части очень важно. Класс, реализующий интерфейс, должен реализовать все необходимые ему интерфейсы в своей области, а не в вложенных классах. Обратите внимание, что это не мешает вам использовать классы вложенности, которые также реализуют ActionListener или другие интерфейсы, но, несмотря на это, правило остается тем, что не абстрактный класс, реализующий интерфейс, должен переопределять все методы интерфейса.

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

+1

Я пришел к такому выводу (GUI не должен реализовывать интерфейсы слушателя) после проведенного мной исследования, в котором была представлена ​​проблема, о которой я спрашивал. Интересно, что в стандартной документации Oracle отсутствует какая-либо ссылка на то, как правильно внедрять исполнителей действий в большой системе меню. – Daniel

+0

@ Даниэль: Я думаю, что документация Oracle является хорошей отправной точкой для изучения рудиментов Swing, но это насколько это возможно. Я сам, я изо всех сил пытаюсь изучить все аспекты создания и поддержки больших приложений Swing и стараться максимально упростить его в отношении MVC, развязки и инъекции зависимостей. Статьи ООП и онлайн-видео-презентации помогают. –

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