Eu tenho uma classe base que contém os seguintes eventos:
public event EventHandler Loading;
public event EventHandler Finished;
Em uma classe que herda dessa classe base, tento gerar o evento:
this.Loading(this, new EventHandler()); // All we care about is which object is loading.
Eu recebo o seguinte erro:
O evento 'BaseClass.Loading' pode aparecer apenas no lado esquerdo de + = ou - = (BaseClass ')
Estou assumindo que não posso acessar esses eventos da mesma forma que outros membros herdados?
c#
events
inheritance
jwarzech
fonte
fonte
Respostas:
O que você precisa fazer é o seguinte:
Na sua classe base (onde você declarou os eventos), crie métodos protegidos que podem ser usados para gerar os eventos:
(Observe que você provavelmente deve alterar esses métodos, a fim de verificar se é necessário chamar o manipulador de eventos ou não).
Em seguida, nas classes herdadas dessa classe base, você pode chamar os métodos OnFinished ou OnLoading para gerar os eventos:
fonte
Você pode acessar apenas um evento na classe declarante, pois o .NET cria variáveis de instância privadas nos bastidores que realmente mantêm o delegado. Fazendo isso..
está realmente fazendo isso;
e fazendo isso ...
é realmente isso ...
Portanto, você pode (obviamente) acessar apenas a variável de instância delegada privada de dentro da classe declarante.
A convenção é fornecer algo assim na classe declarante.
Você pode ligar
OnMyPropertyChanged(EventArgs.Empty)
de qualquer lugar nessa classe ou abaixo da hierarquia de herança para invocar o evento.fonte
Precisamente. É habitual fornecer uma função protegida
OnXyz
ouRaiseXyz
para cada evento na classe base para ativar a geração de classes herdadas. Por exemplo:Chamado na classe herdada:
fonte
Você pode tentar dessa maneira, funciona para mim:
fonte
não para ressuscitar um tópico antigo, mas no caso de alguém estar olhando, o que eu fiz foi
Isso permite herdar o evento em uma classe derivada, para que você possa invocá-lo sem exigir que o método seja encapsulado, mantendo a sintaxe + =. Eu acho que você ainda pode fazer isso com os métodos de embalagem, se você fez
fonte