【问题标题】:Implement an interface and override methods in Java?在 Java 中实现接口并覆盖方法?
【发布时间】:2011-08-04 14:29:48
【问题描述】:

为什么必须重写接口的所有方法?

例如,如果我有

public class Foo extend JFrame implements ActionListener, KeyListener {
      foo(){
      }
    @Override
    public void keyPressed(KeyEvent arg) {          
    }

    @Override
    public void keyReleased(KeyEvent arg) {
}

    @Override
    public void keyTyped(KeyEvent arg) {        
    }
}

我将有很多我什至不会使用的方法,有没有办法删除未使用的已实现方法,例如如果我打算使用界面中的一种方法

我也不想使用抽象,因为这意味着我无法创建对象的实例(至少我的编译器是这样说的)

【问题讨论】:

    标签: java interface implements


    【解决方案1】:

    具体类必须始终实现接口的所有方法。如果您还没有扩展JFrame,您可以扩展KeyAdapter。它为KeyListener 实现了空方法以避免写出它们。您可以在 Foo 类中使用匿名类,如下所示:

    addKeyListener(new KeyAdapter() {
        public void keyTyped(KeyEvent e) {
            // handle typed key here
        }
    });
    

    【讨论】:

    • 我只能扩展一个类?
    • 是的,你只能扩展一个类。您必须将您的关键逻辑拆分为一个扩展 KeyAdapter 的单独类。然后你只需要编写一个你想要覆盖的方法。
    【解决方案2】:

    你真的应该找一本关于面向对象编程的好书,然后重温第一章。接口是方法的完全抽象定义,因此不能部分实现接口。

    【讨论】:

      【解决方案3】:

      接口没有默认实现。如果不是强制你在接口中实现每个方法,那么当其他一些代码试图通过接口调用这些方法时会发生什么?

      【讨论】:

        【解决方案4】:

        你可以创建一个 Foo 的父类,它有这些空方法,让 Foo 只实现你想看到的方法。

        当你实现一个接口时,你必须在某个地方实现它的所有方法才能创建一个具体的对象。

        【讨论】:

          【解决方案5】:

          这正是KeyAdapter 类的用途:它实现了接口的所有方法(但没有一个实现做任何事情)。因为你不能扩展两个类,你应该为你的监听器使用一个内部类(无论如何这是一个更简洁的设计):

          public class Foo extend JFrame {
                foo(){
                    ...
                    component.addKeyListener(new MyKeyListener());
                    ...
                }
          
              private class MyKeyListener extends KeyAdapter{
                  @Override
                  public void keyPressed(KeyEvent arg) {          
                  }
              }
          }
          

          【讨论】:

          • 我希望我能给出两个正确的答案。作为一个问题,我怎么可能将它添加到 JFrame 本身,因为将它添加到 getContentPane() 不起作用 - 请注意它确实适用于 JTextField
          • @user551841:KeyListeners 仅适用于实际获得键盘焦点的组件。对于全局监听键事件,您可能需要使用 KeyEventDispatcher,或者如果它只是您感兴趣的特定键(如热键),请使用键绑定。阅读教程了解详情:download.oracle.com/javase/tutorial/uiswing/misc/…
          【解决方案6】:

          如果你实现了一个接口,这意味着实现的对象可以在任何需要实现的场景中使用。从这个角度来看,很明显你必须实现一个接口的所有方法,否则你不能真正说你已经实现了它。例如如果我有一个带有AddSubtract 方法的ICalculator 接口,而您只想实现Add,那么生成的类真的可以被另一个需要ICalculator 的项目使用吗?

          但是,我非常理解您对今天在框架中实现某些接口的愤怒,因为它们显然违反了Interface Segragation Principle。这意味着一些接口是几个功能的集合,可以一起使用来做一些有用的事情。例如。如果是 ICalculator 接口,而不仅仅是基本的 AddDivide 等方法,我开始添加像 StandardDeviation 这样的方法,这些方法对于 Calculator 对象的性质并不重要。

          底线,是的,你必须实现接口的每一个成员,但是,如果你确定并且知道其中一些将永远使用过,请随意将它们留空,或者更好的是,让它们抛出异常,这样您就可以确定 never 真的意味着从不。

          【讨论】:

            猜你喜欢
            • 2015-04-29
            • 2014-07-17
            • 2012-09-01
            • 2022-01-01
            • 1970-01-01
            • 2016-08-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多