2015-04-28 5 views
4

Предположим, у меня есть два класса: A с недвижимостью A.a, B с недвижимостью B.b.java наблюдатели, вызывающие циклическое наследование

Некоторые свойства в 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 {..} 

Я получаю ошибку компиляции:

cyclic inheritance involving B (or A).

я понимаю, что это может вызвать бесконечный цикл в целом, но не в этом случае. Например, если A.a изменится, A уведомит B. Но так как A.a не влияет на B.b, нет обратного уведомления A и нет цикла.

Я ценю, что Java пытается предотвратить общие проблемы, но мне нужно каким-то образом реализовать это. Какие-либо предложения?

+4

Он похож на тебя» пытаюсь решить что-то с наследованием, которое не должно решаться с наследованием. Я бы хотел использовать общий интерфейс уведомлений, возможно, как PropertyChangeListener, но в остальном использовать композицию. –

+0

Если вы удалите B.Observer из B и A.Obseserver из A, это должно решить проблему – ControlAltDel

+0

Я не уверен, что вы подразумеваете под «B.Observer» и «A.Observer». Стандартный шаблон наблюдателя имеет только один интерфейс Observer, реализованный всеми наблюдателями. – CKing

ответ

2

Используйте 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, который не позволит вам что-то подобное тому, что у вас уже есть, но на этот раз без ошибок компилятора