1

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

例如,如果我有

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

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

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

4

6 回答 6

5

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

addKeyListener(new KeyAdapter() {
    public void keyTyped(KeyEvent e) {
        // handle typed key here
    }
});
于 2011-04-13T10:40:06.543 回答
4

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

于 2011-04-13T10:41:45.497 回答
2

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

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

归根结底,的,您必须实现接口的每一个成员,但是,如果您确定并知道其中一些永远不会被使用,请随意将它们留空,甚至更好,让它们抛出异常,所以你会确定从不真正意味着从不。

于 2011-04-13T10:50:55.890 回答
2

您可以创建具有这些空方法的 Foo 的父类,并让 Foo 仅实现您想要查看的方法。

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

于 2011-04-13T10:42:13.050 回答
2

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

public class Foo extend JFrame {
      foo(){
          ...
          component.addKeyListener(new MyKeyListener());
          ...
      }

    private class MyKeyListener extends KeyAdapter{
        @Override
        public void keyPressed(KeyEvent arg) {          
        }
    }
}
于 2011-04-13T10:43:24.550 回答
0

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

于 2011-04-13T10:40:53.783 回答