140 votes

C# : Déclenchement d’un événement hérité

J’ai une classe de base qui contient les événements suivants :

J’ai essayer dans une classe qui hérite de cette classe de base déclencher l’événement :

J’ai l’erreur suivante :

L’événement « BaseClass.Loading » ne peut apparaître sur le côté gauche de += ou -= (BaseClass)

Je suppose que je ne peux pas accéder à ces événements la même chose que les autres membres hérités ?

150voto

Frederik Gheysels Points 36354

Ce que vous avez à faire, est la suivante :

Dans votre classe de base (où vous avez déclaré les événements), créer des méthodes protégées qui peuvent être utilisés pour déclencher les événements :

(Notez que vous devriez probablement changer ces méthodes, afin de vérifier si vous avez d’invoquer l’eventhandler ou non).

Puis, 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 :

121voto

Adam Robinson Points 88472

Vous ne pouvez accéder à un événement dans la classe de déclaration, comme .NET crée des variables d'instance privé derrière les scènes qui détiennent effectivement le délégué. En faisant cela..

public event EventHandler MyPropertyChanged;

est en train de faire;

private EventHandler myPropertyChangedDelegate;

public event EventHandler MyPropertyChanged
{
    add { myPropertyChangedDelegate += value; }
    remove { myPropertyChangedDelegate -= value; }
}

et cela...

MyPropertyChanged(this, EventArgs.Empty);

est en fait un...

myPropertyChangedDelegate(this, EventArgs.Empty);

Ainsi, vous pouvez (évidemment), seul l'accès privé instance de délégué de la variable dans la classe de déclaration.

La convention est d'offrir quelque chose de ce genre dans la classe de déclaration..

protected virtual void OnMyPropertyChanged(EventArgs e)
{
    EventHandler invoker = MyPropertyChanged;

    if(invoker != null) invoker(this, e);
}

Vous pouvez ensuite appeler OnMyPropertyChanged(EventArgs.Empty) à partir de n'importe où dans la classe ou au-dessous de la hiérarchie d'héritage d'invoquer l'événement.

8voto

Konrad Rudolph Points 231505
<blockquote> <p>Je suppose que je ne peux pas accéder à ces événements la même chose que les autres membres hérités ?</p> <p>Avec précision. Il est de coutume d’offrir une fonction protégée <code></code> ou <code></code> pour chaque événement dans la classe de base pour permettre l’augmentation de classes héritées. Par exemple :</p><pre><code></code></pre><p>Appelée dans la classe héritée :</p><pre><code></code></pre></blockquote>

0voto

Vous pouvez essayer ça, ça marche pour moi :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X