【问题标题】:java observers causing cyclic inheritancejava观察者导致循环继承
【发布时间】:2015-07-07 14:02:31
【问题描述】:

假设我有两个类:A 属性为A.aB 属性为B.b

A 中的一些属性依赖于B.b,但A.a 不依赖于B.b

B 中的一些属性依赖于A.a,但B.b 不依赖于A.a

我希望A 收到B.b 更改的通知,B 收到A.a 更改的通知。如果我使用标准观察者模式:

public class A implements B.Observer {..}

public class B implements A.Observer {..}

我得到一个编译器错误:

涉及 B(或 A)的循环继承。

我意识到这通常会导致无限循环,但在这种情况下不会。例如,如果A.a 发生变化,A 将通知B。但是由于A.aB.b没有影响,所以没有返回通知A也没有循环。

我很欣赏Java 试图防止一般问题,但我需要以某种方式实现这一点。有什么建议吗?

【问题讨论】:

  • 看起来您正在尝试通过继承解决不应通过继承解决的问题。我希望使用通用通知接口,可能类似于 PropertyChangeListener,但在其他方面使用组合。
  • 如果你从 B 中删除 B.Observer,从 A 中删除 A.Obseserver,这应该可以解决问题
  • 我不确定您所说的 B.ObserverA.Observer 是什么意思。标准观察者模式只有一个Observer 接口,所有观察者都实现。
  • 我需要两个观察者接口。一个用于 A.a 的变化,另一个用于 B.b 的变化。我发现我可以在不正式声明观察者接口的情况下以特定于应用程序的方式实现这一点(例如,A 使用 B 中的方法来通知它 A.a 已更改)。然后我可以删除“实现”声明并消除编译器错误。已接受答案中的发布-订阅方法是实现我的目标的更通用方法。

标签: java compiler-errors observer-pattern cyclic


【解决方案1】:

使用publish-subscribe pattern,其中每个类既是发布者又是订阅者。

interface Publisher {
    void addSubscriber(Subscriber sub);
}

interface Subscriber {
    void handle (Object event);
}

class A implements Publisher, Subscriber {...}
class B implements Publisher, Subscriber {...}

如果您不介意使用一些 JavaFX 技术,那么您应该查看properties and binding,它可以让您获得与您已有的类似但这次没有编译器错误的东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多