gpt4 book ai didi

Java 监听器继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:00:18 25 4
gpt4 key购买 nike

我有一个 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) {
..
}

}

这是正确的做法吗?我在网上搜索示例,但找不到任何示例。

在这个解决方案中有一些我不喜欢的地方:

  1. BListener 有两种方法,一种使用 AEvent,另一种使用 BEvent 作为参数。
  2. B 类都有addAListeneraddBListener 方法。我应该用 private 关键字隐藏 addAListener 吗? [更新:无法使用私有(private)关键字隐藏]
  3. fireAListenerEvent1fireBListenerEvent1 方法存在类似问题。

我使用的是 Java 1.5 版。

最佳答案

我不明白为什么 BListener 应该扩展 AListener

你真的想强制所有对 B 事件感兴趣的人也实现 event1() 吗?

您也不能添加 addAListener(),因为派生类不能降低父类中存在的方法的可见性。此外,您不需要这样做,否则您会违反 Liskov substitution principle (每个 B 都必须能够做 A 能做的一切)。

最后,我将保护 fire*() 方法。通常根本没有理由让它们公开,减少公开成员的数量可以保持你的公共(public)界面干净。

关于Java 监听器继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/370695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com