一尘不染

Java Listener继承

java

我有一个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? [更新:无法使用私人关键字隐藏]
  3. fireAListenerEvent1fireBListenerEvent1方法存在类似问题。

我正在使用Java版本1.5。


阅读 273

收藏
2020-12-03

共1个答案

一尘不染

我看不出为什么BListener要延长的理由AListener

您是否真的要强迫每个对B事件感兴趣的人也实施event1()

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

最后,我要对fire*()方法进行保护。通常没有任何理由让他们保持公开状态,减少公共成员的数量可以使您的公共界面保持整洁。

2020-12-03