为什么必须覆盖接口的所有方法?
例如,如果我有
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) {
}
}
我将有很多我甚至不会使用的方法,有没有办法删除未使用的已实现方法,例如,如果我打算从界面使用一个方法
我也不想使用抽象,因为这意味着我无法创建对象的实例(至少我的编译器是这样说的)
答案 0 :(得分:5)
具体类必须始终实现接口的所有方法。如果您尚未展开JFrame
,则可以延长KeyAdapter
。它为KeyListener
实现了空方法,以避免将它们写出来。您可以在Foo
类中使用匿名类,如下所示:
addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
// handle typed key here
}
});
答案 1 :(得分:4)
接口没有默认实现。如果您没有被迫在接口中实现每个方法,那么当其他一些代码试图通过接口调用这些方法时会发生什么?
答案 2 :(得分:2)
您可以创建具有这些空方法的Foo父类,并让Foo只实现您想要查看的方法。
实现接口时,必须在某处实现其所有方法才能创建具体对象。
答案 3 :(得分:2)
这正是KeyAdapter
类的用途:它实现了接口的所有方法(但没有任何实现做任何事情)。由于你不能扩展两个类,你应该为你的监听器使用一个内部类(无论如何这是一个更干净的设计):
public class Foo extend JFrame {
foo(){
...
component.addKeyListener(new MyKeyListener());
...
}
private class MyKeyListener extends KeyAdapter{
@Override
public void keyPressed(KeyEvent arg) {
}
}
}
答案 4 :(得分:2)
如果实现了接口,则意味着可以在需要实现的任何场景中使用已实现的对象。从这个角度来看很明显,你必须实现接口的所有方法,否则你不能说你已经实现了它。例如如果我有一个ICalculator
接口与Add
和Subtract
方法,并且您只想实现Add
,那么结果类是否真的可以由另一个需要ICalculator?
但是,我非常了解你今天在框架中实现一些接口的愤怒,因为它们明显打破了Interface Segragation Principle。这意味着某些接口是几个功能的集合,可以一起使用来做一些有用的事情。例如。如果ICalculator接口,而不仅仅是基本Add
,Divide
等方法,我开始添加StandardDeviation
等方法,这些方法对于Calculator
对象的性质不是必不可少的
底线,是,您必须实现每个界面的成员,但是,如果您确定并且知道其中一些永远不会成为使用,随意留空,甚至更好,让他们抛出异常,所以你肯定永远真的意味着永远不会。
答案 5 :(得分:0)
你真的应该抓一本关于面向对象编程的好书并重温第一章。接口是方法的完全抽象定义,因此您无法部分实现接口。