2016-02-19 4 views
1

Предположим, у меня есть коробка. В коробке есть куча конвертов. В каждом конверте имеется несколько индексных карточек. Если я пишу что-то на одной карточке индекса, каждая индексная карта во всем поле должна выполнять метод foo().Многоуровневые обработчики событий

Как я вижу, указательная карточка должна сообщить своему конверту, что что-то произошло. Его конверт должен сообщить коробке, что что-то случилось с одной из его карточек. В поле указано, что все конверты сообщают всем своим индексным картам о выполнении метода foo().

Я относительно не знаком с функциями обработчика событий/делегатов C#. Из того, что я могу сказать, это, по-видимому, полезно для них. Есть ли у делегатов путь сюда, или есть лучший способ? Как вы могли бы выкинуть рамки для многоуровневых обработчиков событий? Любое понимание было бы оценено.

+1

Похож на хороший вариант использования шаблона публикации/подписания. Все индексные карточки будут подписчиками, а потенциально издателями – Rob

ответ

0

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

Если я предполагаю, что в коробке есть список конвертов, содержащихся (или карточек-указателей), а в конвертах есть список карточек-индексов, которые он содержит, вы могли бы;

  1. Коробка прослушивает события, и перечисляет каждый конверт она содержит , в котором перечисляется вся картотеку, чтобы сделать обновление.
  2. Конверты прослушивают события и перечисляют каждую карточку индекса, которую они содержат, чтобы сделать обновление
  3. Каждая индексная карточка прослушивает события и обновляет себя.

Но проблема, которую я вижу в этом подходе, заключается в том, что количество индексных карточек может быть высоким. Таким образом, у вас может быть много индексных карт, которые прослушивают множество других карточек.

Я думаю, что лучше в этом случае пойти на метод публикации/подписки, предложенный Робом. Таким образом, вы реализуете очередь сообщений, а затем измененная индексная карта публикует здесь изменение, а все остальное, что прослушивается, получает информацию об изменении. Это было бы лучшим подходом.

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

Смежные вопросы