Ce qui ne marche pas n'est pas le fait de rendre l'évènement abstrait, mais le fait de l'utiliser comme tu le fais dans OnMyAction alors qu'il est abstrait.
En fait, il y a une petite subtilité avec les évènements en C#... Un évènement est en réalité une paire d'accesseurs add/remove (un peu comme les accesseurs get/set pour une propriété). Ces accesseurs gèrent l'ajout et la suppression des handlers de l'évènement (généralement stockés dans un champ delegate du type correspondant, mais pas forcément).
En pratique, l'implémentation sera quasiment toujours la même, donc C# nous facilite la vie en implémentant automatiquement les évènements si on ne fournit pas d'implémentation explicite. Quand tu écris ceci :
public event EventHandler MyEvent;
Le compilateur génère en fait quelque chose comme ça (un peu simplifié) :
1 2 3 4 5 6 7 8
| // Champ delegate où sont stockés les handlers
private EventHandler _myEvent;
public event EventHandler MyEvent
{
add { _myEvent += value; }
remove { _myEvent -= value; }
} |
Dans ton code, le champ _myEvent n'est pas accessible directement; tu y accèdes via le nom de l'évènement MyEvent, et selon le contexte, le compilateur sait si tu fais référence au champ ou à l'évènement. Par exemple, si tu fais ça :
MyEvent(this, EventArgs.Empty);
Le compilateur sait que tu fais en fait référence au champ _myEvent pour l'invoquer (car ça n'aurait pas de sens d'utiliser l'évènement lui-même dans ce contexte)
Maintenant, si tu déclares l'évènement comme abstrait, le compilateur ne génère pas d'implémentation (puisque par définition un membre abstrait n'a pas d'implémentation). Il n'y a donc pas de champ correspondant à l'évènement qui stocke la liste des handlers... donc écrire MyAction() n'a pas de sens, puisque MyAction, dans ce contexte, fait référence à un évènement (utilisable seulement avec += et -=) et non à un champ de type delegate.
Je t'invite à lire cet article pour mieux comprendre les subtilités des délégués et évènements

Envoyé par
antoine.debyser
Ca n'a pas de sens de vouloir rendre virtual ou abstract un événement.
En pratique ça ne se fait pas beaucoup, mais de là à dire que ça n'a pas de sens... ça veut juste dire que tu veux exposer un évènement mais que c'est les classes dérivées qui doivent l'implémenter. Ce n'est pas plus absurde qu'une méthode ou une propriété abstraite.
Cela dit, dans le cas présent ça ne semble effectivement pas très utile...
Partager