Должен реализовать унаследованный абстрактный метод

Мой класс реализует 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 e). Нельзя ли таким образом реализовать методы переопределения во вложенном классе?


person Daniel    schedule 15.06.2013    source источник
comment
Голосование против отменено голосованием за. Я не уверен, почему кто-то проголосовал за этот вопрос, поскольку он кажется мне правильным.   -  person Hovercraft Full Of Eels    schedule 16.06.2013
comment
++ из-за ответа @HovercraftFullOfEels :)   -  person Azad    schedule 16.06.2013


Ответы (1)


Ваш вопрос:

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

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

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

person Hovercraft Full Of Eels    schedule 15.06.2013
comment
Я пришел к такому выводу (GUI не должен реализовывать интерфейсы прослушивателя) после проведенного мной исследования, которое выявило проблему, о которой я спрашивал. Интересно, что в стандартной документации Oracle, по-видимому, отсутствуют какие-либо ссылки на то, как правильно реализовать прослушиватели действий в большой системе меню. - person Daniel; 16.06.2013
comment
@Daniel: Я думаю, что документация Oracle - хорошая отправная точка для изучения основ Swing, но это все, что нужно. Лично я изо всех сил пытаюсь изучить все тонкости создания и обслуживания больших приложений Swing и пытаюсь сохранить их как можно более чистыми в отношении MVC, развязки и внедрения зависимостей. Помогают статьи об ООП и онлайн-видеопрезентации. - person Hovercraft Full Of Eels; 16.06.2013