我目前正在开发一个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;
}
});
但是,如您所见,我不需要覆盖所有方法。更糟糕的是,通过覆盖它们我失去了功能。有没有办法保留原始方法并只覆盖某些方法?
答案 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中有很多例子,例如FocusListener
和FocusAdapter
:
用于接收键盘焦点事件的抽象适配器类。此类中的方法为空。此类用于创建侦听器对象。
扩展此类以创建
FocusEvent
侦听器并覆盖感兴趣事件的方法。 (如果实现了FocusListener
接口,则必须定义其中的所有方法。这个抽象类为它们定义了所有的null方法,因此您只需要为您关心的事件定义方法。)
Java API调用这些“适配器”,尽管这是对该术语的一个相当可疑的用法。 “适配器模式”应该用于使一种类型适应另一种类型,这不是这些API类所做的。
答案 1 :(得分:0)
如果你正在扩展一个类,你可以省略任何方法,并允许它们通过超类来处理。或者,您也可以在实施中致电super();
。
从一个快速的谷歌来看,在我看来SVGEventListener
是一个接口而不是一个类,所以是的,你必须实现所有方法。你不应该失去任何功能,因为interface
没有实现代码 - 没有什么可失去的。
答案 2 :(得分:0)
1)不要使用匿名类。扩展自己的,你可能只会覆盖你需要的东西。
2)失去功能只是因为你没有在重写方法体中使用super.nameOfMethod()。
3)学习Java的基础知识。在开始使用Java之前,可能值得花一两个星期阅读一本关于Java的书。并且发布关于琐碎事情的问题。