我有一个 java 类可以触发自定义 java 事件。代码结构如下:
public class AEvent extends EventObject {
...
}
public interface AListener extends EventListener {
public void event1(AEvent event);
}
public class A {
public synchronized void addAListener(AListener l) {
..
}
public synchronized void removeAListener(AListener l) {
..
}
protected void fireAListenerEvent1(AEvent event) {
..
}
}
一切正常,但我想创建一个新的 A 子类(称之为 B),它可能会触发一个新事件。我正在考虑以下修改:
public class BEvent extends AEvent {
...
}
public interface BListener extends AListener {
public void event2(BEvent event);
}
public class B extends A {
public synchronized void addBListener(BListener l) {
..
}
public synchronized void removeBListener(BListener l) {
..
}
protected void fireBListenerEvent2(AEvent event) {
..
}
}
这是正确的做法吗?我在网上搜索示例,但找不到任何示例。
在这个解决方案中有一些我不喜欢的地方:
BListener
有两种方法,一种使用AEvent
,另一种使用BEvent
作为参数。B
类都有addAListener
和addBListener
方法。我应该用 private 关键字隐藏 addAListener 吗? [更新:无法使用私有(private)关键字隐藏]fireAListenerEvent1
和fireBListenerEvent1
方法存在类似问题。
我使用的是 Java 1.5 版。
最佳答案
我不明白为什么 BListener
应该扩展 AListener
。
你真的想强制所有对 B
事件感兴趣的人也实现 event1()
吗?
您也不能添加 addAListener()
,因为派生类不能降低父类中存在的方法的可见性。此外,您不需要这样做,否则您会违反 Liskov substitution principle (每个 B 都必须能够做 A 能做的一切)。
最后,我将保护 fire*()
方法。通常根本没有理由让它们公开,减少公开成员的数量可以保持你的公共(public)界面干净。
关于Java 监听器继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/370695/