Как переопределить только определенные методы - PullRequest
3 голосов
/ 27 августа 2011

Я сейчас работаю над приложением java me, и у меня есть этот код:

svgForm.setSVGEventListener(new SVGEventListener(){
                public void keyPressed(int i) {
                    System.out.println("Val"+i);
                }
                public void keyReleased(int i) {
                    System.out.println("Val"+i);
                }
                public void pointerPressed(int i, int i1) {
                    return;
                }
                public void pointerReleased(int i, int i1) {
                    return;
                }
                public void hideNotify() {
                    return;
                }
                public void showNotify() {
                    return;
                }
                public void sizeChanged(int i, int i1) {
                    return;
                }
});

Однако, как вы видите, мне не нужно переопределять все методы. Еще хуже, переопределяя их, я теряю функциональность. Есть ли способ сохранить оригинальные методы и переопределить только определенные?

Ответы [ 3 ]

10 голосов
/ 27 августа 2011

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

public class BaseSVGEventListener implements BaseSVGEventListener {
            public void keyPressed(int i) {}
            public void keyReleased(int i) {}
            public void pointerPressed(int i, int i1) {}
            public void pointerReleased(int i, int i1) {}
            public void hideNotify() {}
            public void showNotify() {}
            public void sizeChanged(int i, int i1) {}
}

А потом:

svgForm.setSVGEventListener(new BaseSVGEventListener (){
            public void keyPressed(int i) {
                System.out.println("Val"+i);
            }
            public void keyReleased(int i) {
                System.out.println("Val"+i);
            }
});

Есть много примеров этого в API Java AWT / Swing, например FocusListener и FocusAdapter:

Абстрактный класс адаптера для получения событий фокуса клавиатуры. Методы в этом классе пусты. Этот класс существует как удобство для создания объектов слушателя.

Расширьте этот класс, чтобы создать слушатель FocusEvent и переопределить методы для интересующих событий. (Если вы реализуете интерфейс FocusListener, вы должны определить все методы в нем. Этот абстрактный класс определяет нулевые методы для них всех, поэтому вам нужно только определять методы для событий, которые вас интересуют.)

Java API называет эти «адаптеры», хотя это довольно сомнительное использование этого термина. Предполагается, что «шаблон адаптера» используется для адаптации одного типа к другому, что не делают эти классы API.

0 голосов
/ 27 августа 2011

1) не используйте анонимный класс. Расширьте свои собственные, и вы можете переопределить только то, что вам нужно.

2) потеря функциональности только потому, что вы не используете super.nameOfMethod () в теле переопределенных методов.

3) Изучите основы Java. Возможно, стоит потратить неделю или две на чтение книги по Java, прежде чем начать работать с ней. И размещение вопросов на тривиальные вещи.

0 голосов
/ 27 августа 2011

Если вы расширяете класс, вы можете просто опустить любые методы и разрешить их обработку через суперкласс.В качестве альтернативы вы можете просто вызвать super(); в своей реализации.

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

...