Hallo Reiner,
folgendes ist meine Vermutung, kann es hier wegen Ermangelung von ReSharper nicht testen:
- Wenn die abstrakte Basisklasse ein Event deklariert, dann generiert der Compiler die Accessor Methoden (Die Add und Remove Methoden) für die Basisklasse
- Eine Ableitung, die das Event überschreibt, und dann auslöst wird höchstwahrscheinlich die Accessormethoden aus der Basisklasse aufrufen, was wahrscheinlich unerwünscht ist
Laut MSDN kann man das Event in der Basisklasse explizit mit dem Schlüsselwort
abstract deklarieren, dann baut der Compiler keine Accesor Methoden dafür, eventuell löst das Dein Problem?
Microsoft predigt aber da ein anderes Pattern. Das "OnMyEvent"-Pattern, das so aussieht:
/// <summary>
/// Abstrakte Klasse, die das Microsoft Event Pattern implementiert.
/// </summary>
public abstract class AbstractEventClass
{
/// <summary>
/// Die Deklaration des Events.
/// </summary>
public event EventHandler<EventArgs> MyEvent;
/// <summary>
/// Eine geschützte Methode, die letztlich das Ereignis auslöst.
/// </summary>
/// <param name="args">Ereignisparameter, die übergeben werden sollen.</param>
protected virtual void OnMyEvent(EventArgs args)
{
if (MyEvent != null)
{
MyEvent(this, args);
}
}
}Die Ableitung sähe dann so aus:
/// <summary>
/// Eine Ableitung der <see cref="T:AbstractEventClass"/> Klasse.
/// </summary>
public class ConcreteEventClass : AbstractEventClass
{
/// <summary>
/// Flag, das angibt, ob das Ereignis unterdrückt werden soll.
/// </summary>
private bool suppressEvent = true;
/// <summary>
/// Methode, die das Ereignis <see cref="E:MyEvent"/> auslösen wird,
/// falls es mit dem Flag <see cref="T:suppressEvent"/> nicht unterdrückt wird.
/// </summary>
/// <param name="args">Ereignisparameter, die übergeben werden sollen.</param>
protected override void OnMyEvent(EventArgs args)
{
if (!suppressEvent)
{
base.OnMyEvent(args);
}
}
}Ich denke mit diesem Pattern sind alle Möglichkeiten offen, oder?
Grüße
Timo