Ho una classe base DockedToolWindow: Form e molte classi che derivano da DockedToolWindow. Ho una classe contenitore che conserva e assegna gli eventi agli oggetti DockedToolWindow, tuttavia desidero richiamare gli eventi dalla classe figlio.Evento eventi di classe base in classi derivate C#
In realtà ho una domanda su come implementare ciò che questo MSDN site mi sta dicendo di fare. Questa sezione sotto di me sta dando il problema:
// The event. Note that by using the generic EventHandler<T> event type
// we do not need to declare a separate delegate type.
public event EventHandler<ShapeEventArgs> ShapeChanged;
public abstract void Draw();
//The event-invoking method that derived classes can override.
protected virtual void OnShapeChanged(ShapeEventArgs e)
{
// Make a temporary copy of the event to avoid possibility of
// a race condition if the last subscriber unsubscribes
// immediately after the null check and before the event is raised.
EventHandler<ShapeEventArgs> handler = ShapeChanged;
if (handler != null)
{
handler(this, e);
}
}
Certo questo esempio compila e funziona, ma quando sostituisco "ShapeChanged" con "Move" (un evento che ho acquisito da derivante da Form), esso errori dicendo che non posso avere Move sul lato destro senza + = o - =. Ho rimosso anche i tag generici di ShapeEventArgs.
Qualche istigazione sul perché questo non funziona? Qual è la differenza tra un evento dichiarato all'interno della classe e uno ereditato?
Vedo che OnMove() risolverebbe questo, tuttavia, come non può richiamare OnMove() in modo esplicito quando è necessario, posso? Non so dove il framework in realtà chiami il delegato di Move, ed è probabilmente nascosto da me comunque. – Balk
OnMove lancia l'evento Move, nello stesso modo in cui OnShapeChanged attiva l'evento ShapeChanged nel codice. È uno schema comune per aggiungere membri protetti che generano eventi, per renderli visibili alle classi derivate. In tal caso, viene generalmente aggiunto il prefisso "On" (OnMove, OnClick, ecc.) – Groo
Per vedere dove il framework attiva l'evento Move, utilizzare lo strumento Reflector (http://www.red-gate.com/products/reflector /) per ottenere il codice sorgente per il metodo Form.OnMove. – Groo