【问题标题】:How do I override only specific methods如何仅覆盖特定方法
【发布时间】:2011-08-27 11:42:04
【问题描述】:

我目前正在开发一个 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;
                }
});

但是,如您所见,我不需要重写所有方法。更糟糕的是,通过覆盖它们,我失去了功能。有没有办法保留原始方法并只覆盖某些方法?

【问题讨论】:

  • 当实现一个接口时,你必须重写该接口声明的所有方法。界面没有功能,那么你怎么会失去功能呢?如果您是从实现了这些方法的类扩展而来,则可以省略它们。

标签: java methods overriding


【解决方案1】:

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

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 类所做的。

【讨论】:

  • 您可以在 javax.swing 中广泛找到这种模式。例如,MouseListener 接口和 MouseAdapter 实现可以为您节省大量输入。
【解决方案2】:

如果您要扩展一个类,您可以省略任何方法并允许它们通过超类进行处理。或者你可以在你的实现中调用super();

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

【讨论】:

    【解决方案3】:

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

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

    3) 学习非常基础的 Java。在开始使用 Java 之前,可能值得花一两周时间阅读一本关于 Java 的书。并发布关于琐碎问题的问题。

    【讨论】:

      猜你喜欢
      • 2012-06-14
      • 2021-06-11
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多