Обратный вызов против ссылки на объект - PullRequest
0 голосов
/ 22 сентября 2018

Вопрос проектирования. Предположим, у нас есть родительский и дочерний объекты.Иногда дочерний объект говорит: «Родитель, ты должен обновить свое состояние».Итак, есть ли критическая разница между

  1. передачей родительского объекта ссылки в дочерний конструктор

и

Передача родительского объекта функция callBack в дочерний конструктор

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

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Кажется хорошим примером для наблюдателя, особенно если ребенку не нужна информация о состоянии от родителя.И если родитель хочет игнорировать ребенка (к сожалению, это происходит так часто), вы можете просто отписаться от события.

class Parent
{
  public Parent(Child child)
  {
    Child = child;
    Child.UpdateYourStatus += ComputeNewStateAndOutput;
  }

  Child Child {get; set;}

  private void ComputeNewStateAndOutput(sender, e) { ... }

  public void DisownChild()
  {
    //You are no longer my son (sigh, heard that one before)
    Child.UpdateYourStatus -= ComputeNewStateAndOutput;
  }
}

class Child
{
  public event EventHandler UpdateYourStatus;
}
0 голосов
/ 24 сентября 2018

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

У Microsoft есть некоторые рекомендации относительно того, когда вы можете выбрать одно из другого: https://msdn.microsoft.com/library/2e759bdf-7ca4-4005-8597-af92edf6d8f0

Одна веская причина выбрать объектную ссылку / интерфейс вместо обратного вызоваявляется то, что вы знаете, что определенно собираетесь вызвать несколько обратных вызовов на родителя.Имеет смысл передать одну ссылку, реализующую интерфейс, который определяет все эти обратные вызовы, вместо того, чтобы создавать группы экземпляров делегатов и передавать их все вместе.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...