J'ai une classe de base qui contient les événements suivants:
public event EventHandler Loading;
public event EventHandler Finished;
Dans une classe qui hérite de cette classe de base, j'essaye de déclencher l'événement:
this.Loading(this, new EventHandler()); // All we care about is which object is loading.
Je reçois l'erreur suivante:
L'événement 'BaseClass.Loading' ne peut apparaître que sur le côté gauche de + = ou - = (BaseClass ')
Je suppose que je ne peux pas accéder à ces événements de la même manière que les autres membres hérités?
c#
events
inheritance
jwarzech
la source
la source
Réponses:
Voici ce que vous devez faire:
Dans votre classe de base (où vous avez déclaré les événements), créez des méthodes protégées qui peuvent être utilisées pour déclencher les événements:
(Notez que vous devriez probablement changer ces méthodes, afin de vérifier si vous devez invoquer le gestionnaire d'événements ou non).
Ensuite, dans les classes qui héritent de cette classe de base, vous pouvez simplement appeler les méthodes OnFinished ou OnLoading pour déclencher les événements:
la source
Vous ne pouvez accéder à un événement que dans la classe déclarante, car .NET crée des variables d'instance privée dans les coulisses qui contiennent réellement le délégué. Ce faisant..
fait réellement cela;
et faire ça ...
est en fait ça ...
Ainsi, vous ne pouvez (évidemment) accéder à la variable d'instance de délégué privé qu'à partir de la classe déclarante.
La convention est de fournir quelque chose comme ça dans la classe déclarante.
Vous pouvez ensuite appeler
OnMyPropertyChanged(EventArgs.Empty)
de n'importe où dans cette classe ou en dessous de l'héritage d'héritage pour invoquer l'événement.la source
Précisément. Il est courant de fournir une fonction protégée
OnXyz
ouRaiseXyz
pour chaque événement de la classe de base pour permettre la levée à partir des classes héritées. Par exemple:Appelé dans la classe héritée:
la source
Vous pouvez essayer de cette façon, cela fonctionne pour moi:
la source
pas pour ressusciter un vieux fil mais au cas où quelqu'un chercherait, ce que j'ai fait était
Cela vous permet d'hériter de l'événement dans une classe dérivée afin de pouvoir l'invoquer sans avoir à encapsuler la méthode tout en conservant la syntaxe + =. Je suppose que vous pouvez toujours le faire avec les méthodes d'emballage si vous le faisiez
la source