ООП:проблема с уведомлением других объектов в иерархии

StackOverflow https://stackoverflow.com/questions/1853162

Вопрос

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

  • Тест
    • Список вопросов
      • Вопрос
        • Список ответов
          • Ответ

Итак:
в викторине есть список вопросов
список вопросов содержит несколько вопросов
у вопроса есть список ответов
список ответов содержит несколько Ответов

Когда будет получен ответ (здесь мы говорим о Flash AS3):
Ответ уведомляет список отвечающих.
Список ответов уведомляет о вопросе.
Вопрос уведомляет список спрашивающих.
Список вопросов уведомляет о проведении викторины.

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

Спасибо.

Это было полезно?

Решение

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

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

  • Будет нажат Ответ (кнопка), и прослушивающий список ответов заметит это.
  • Список ответов отправляет событие "answered", которое получает вопрос.
  • Вопрос отправляет событие "answered" для уведомления списка вопросов о пометке этого вопроса как отвеченного
  • Когда Список вопросов получит события с ответами по всем вопросам, он отправляет событие "завершено", сообщающее о завершении теста

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top