ООП: проблема уведомления других объектов в иерархии - PullRequest
0 голосов
/ 05 декабря 2009

Я всегда борюсь с отправкой сообщений между объектами. Рассмотрим иерархию объектов викторины:

  • Quiz
    • QuestionList
      • Вопрос
        • AnswerList
          • Ответ

Итак:
викторина имеет вопросник
вопросник имеет несколько вопросов
вопрос имеет список ответов
список ответов имеет несколько ответов

Когда нажимается Ответ (здесь мы говорим о Flash AS3):
Ответ уведомляет AnswerList.
AnswerList уведомляет о вопросе.
Вопрос уведомляет QuestionList.
QuestionList уведомляет о викторине.

Другими словами, сообщение всплывает. Это возможно, так как я передаю каждый родительский объект через конструктор его потомка. Но я думаю, что где-то читал, что объекты не должны знать о своем родителе. Стоит ли использовать другой подход?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 05 декабря 2009

Да, вы не должны давать дочерним объектам ссылки на своих родителей. Я полагаю, что ситуация, которую вы объяснили выше, является иерархией отображения. В этом случае вы могли бы сделать это намного лучше, используя систему событий. Вы можете создавать пользовательские события, которые отправляются, когда что-то происходит, и родитель добавляет слушателей к событиям, чтобы позаботиться о них.

Возможный сценарий события для вашей структуры будет, например, следующим:

  • Ответ (кнопка) нажимается, и прослушивающий список ответов замечает, что.
  • AnswerList отправляет событие «отвечено», которое получает вопрос.
  • Вопрос отправляет событие с ответом, чтобы уведомить Список вопросов, чтобы пометить этот вопрос как ответ
  • Когда список вопросов получил ответы на события по всем вопросам, он отправляет «завершенное» событие, чтобы сообщить Викторине, что оно завершено
1 голос
/ 05 декабря 2009

Вы можете посмотреть на шаблон Observer . В этом шаблоне проектирования объекты могут прослушивать изменения (или события) объекта. Таким образом, сообщения могут пузыриться, чтобы дети не знали своего родителя напрямую. Они просто знают, что должны уведомить своих слушателей, что что-то изменилось. Вы можете даже прослушать несколько объектов, если хотите.

...