Java 监听器继承

标签 java inheritance events listener

我有一个 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/

相关文章:

java - Jax-RS JsonFormat 日期未知 39

java - 如何使用 Java 流展平 map 值

java - 为什么我得到不同的 java 版本

Python:如何在创建时向父类注册所有子类

java - 从其子类的实例访问父类(super class)的属性

c# - 事件增强

javascript - addEventListener ("loadedmetadata",有趣)没有正确运行,Firefox 错过事件

java - 在 Spring 中使用 Mockito 模拟属性文件

java - 如何在数据库中保存层次结构类?

c# - 您需要在析构函数中删除事件处理程序吗?