Tengo una clase base DockedToolWindow: Form y muchas clases que se derivan de DockedToolWindow. Tengo una clase contenedora que contiene y asigna eventos a objetos DockedToolWindow, sin embargo, deseo invocar los eventos desde la clase secundaria.Levantar eventos de clase base en clases derivadas C#
De hecho, tengo una pregunta sobre cómo implementar lo que este MSDN site me dice que haga. Esta sección de abajo me está dando el 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);
}
}
Claro este ejemplo compila y funciona, pero cuando sustituyo "ShapeChanged" con "Move" (un evento que adquirí desde que deriva de la Forma), él los errores diciendo que no puedo tener Move en el lado derecho sin + = o - =. También eliminé las etiquetas genéricas ShapeEventArgs.
¿Alguna incitación sobre por qué esto no está funcionando? ¿Cuál es la diferencia entre un evento declarado dentro de la clase y uno que se hereda?
Veo que OnMove() resolvería esto, sin embargo, ¿cómo no puedo invocar la explicidad de OnMove() cuando es necesario? No sé dónde se llama realmente el marco al delegado Move, y probablemente esté oculto para mí de todos modos. – Balk
OnMove activa el evento Mover, del mismo modo que OnShapeChanged activa el evento ShapeChanged en su código. Es un patrón común agregar miembros protegidos que desencadenan eventos para que sean visibles para las clases derivadas. En ese caso, el prefijo "Encendido" generalmente se agrega (OnMove, OnClick, etc.) – Groo
Para ver dónde el marco realmente dispara el evento Move, use la herramienta Reflector (http://www.red-gate.com/products/reflector /) para obtener el código fuente para el método Form.OnMove. – Groo