如何仅覆盖特定方法

时间:2011-08-27 11:42:04

标签: java methods override

我目前正在开发一个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 个答案:

答案 0 :(得分:10)

你别无选择,需要全部实施。但是,一个常见的模式是有一个基类,它提供接口中方法的无操作实现,然后在需要做一些有用的事情时扩展该基类:

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);
            }
});

Java AWT / Swing API中有很多例子,例如FocusListenerFocusAdapter

  

用于接收键盘焦点事件的抽象适配器类。此类中的方法为空。此类用于创建侦听器对象。

     

扩展此类以创建FocusEvent侦听器并覆盖感兴趣事件的方法。 (如果实现了FocusListener接口,则必须定义其中的所有方法。这个抽象类为它们定义了所有的null方法,因此您只需要为您关心的事件定义方法。)

Java API调用这些“适配器”,尽管这是对该术语的一个相当可疑的用法。 “适配器模式”应该用于使一种类型适应另一种类型,这不是这些API类所做的。

答案 1 :(得分:0)

如果你正在扩展一个类,你可以省略任何方法,并允许它们通过超类来处理。或者,您也可以在实施中致电super();

从一个快速的谷歌来看,在我看来SVGEventListener是一个接口而不是一个类,所以是的,你必须实现所有方法。你不应该失去任何功能,因为interface没有实现代码 - 没有什么可失去的。

答案 2 :(得分:0)

1)不要使用匿名类。扩展自己的,你可能只会覆盖你需要的东西。

2)失去功能只是因为你没有在重写方法体中使用super.nameOfMethod()。

3)学习Java的基础知识。在开始使用Java之前,可能值得花一两个星期阅读一本关于Java的书。并且发布关于琐碎事情的问题。