Поднятие событий в интерфейсах - PullRequest
1 голос
/ 23 января 2009

Я реализую проект в шаблоне MVP, и у меня есть несколько интерфейсов, подобных этому:

public interface IWizardStep {
  event EventHandler NextStep;
}

public interface ISubmitable {
  event EventHandler Submit;
}

 public interface IStep : ISubmitable, IWizardStep {
  string SomeProperty { get; set; }
 }

Мой класс докладчика имеет следующее:

public class StepPresenter {
  public IStep View { get; set; }

  public StepPresenter() {
    this.View.Submit += new EventHandler(StepSubmitted);
  }

  void StepSubmitted(object sender, EventArgs e){
    //do some processing

    //Now I want to raise the Next event
    //this.View.NextStep(sender, e) throws a compile error
  }

}

Итак, я получаю ошибку компиляции при попытке вызвать событие NextStep в представлении. Я почти уверен, что это проблема, потому что я не реализовал обработчик событий для NextStep, но этот ведущий не будет обрабатывать событие.

Докладчик будет реализован как один шаг из многих в мастере формы (ASP.NET, но это не имеет никакого значения), и мастер поймает событие NextStep и покажет следующий шаг мастера.

Так, как я могу создать событие на интерфейсе, подобном этому, или это невозможно?

Ответы [ 2 ]

1 голос
/ 23 января 2009

Это потому, что NextStep является EventHandler. Вы не можете вызвать обработчик события, который должен быть вызван. Я ожидаю, что IStep будет иметь вызов метода, такого как MoveToStep (), который в конкретной реализации вызовет событие, как и ожидалось, на которое вы могли бы подписаться где-то еще.

Что вы думаете о событии NextStep EventHandler в IWizardStep? Если вам нужен метод, создайте его в своем интерфейсе вместо события. Ваш потребительский класс должен ожидать вызова метода, когда ему нужно что-то сделать, и подписаться на событие, когда IWizardStep должен что-то передать (данные или что-то еще)

0 голосов
/ 23 января 2009

@ Рэй Бойсен:

Да, сразу после публикации я понял, что не должен пытаться вызвать событие в интерфейсе, но мне следует вызывать метод, который вызывает событие в представлении. Поэтому я изменил свои интерфейсы и классы так:

public interface IWizardStep<TEventArgs> {
  event EventHandler<TEventArgs> NextStep;

  void RaiseNextStep<TSender>(TSender sender, TEventArgs e);
}

public class Step {
  void StepSubmitted(object sender, EventArgs e) {
    this.View.RaiseNextStep(sender, e);
  }
}

Тогда в реализации View у меня есть:

public void RaiseNextStep<TSender>(TSender sender, EventArgs e) {
  if(this.NextStep != null) this.NextStep(sender, e);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...