2009-03-18 16 views
22

Estoy creando una subclase de Button y me gustaría agregar funciones personalizadas a algunos de sus eventos, como OnClick. ¿Cuál es la forma más deseable de hacerlo? Cómo puedo reemplazar OnClick:Uso de controladores de eventos vs métodos de generación de eventos predeterminados

protected override void OnClick(EventArgs e) 
{ 
    base.OnClick(e); 
    doStuff(); 
} 

o debería vincularse lugar el evento OnClick a un controlador de eventos definidos en mi botón subclase a través del diseñador?

class ButtonSubclass 
{ 
    public ButtonSubclass() : base() 
    { 
     InitializeComponent(); 
    } 

    private void InitializeComponent() 
    { 
     this.Click += new System.EventHandler(this.ButtonSubclass_Click); 
    } 
} 

Editar: he añadido pequeños cambios visuales (que puede pasar desollado como rudimentaria), pero la mayoría de los cambios son en manejadores de eventos que no desea volver a aplicar (copiar y pegar) en cada forma que lo reutiliza.

Respuesta

26

Si realmente está especializando el botón, tiene sentido anular OnClick. Si solo está en realidad cambiando lo que sucede cuando se hace clic en un botón, yo no crearía la subclase Button en primer lugar - Me gustaría solo agregar controladores de eventos.

EDITAR: Solo para dar un poco más de una idea: si desea agregar controladores de eventos similares para varios botones, es bastante fácil escribir un método de utilidad para hacer eso, y llamarlo desde varios lugares. No requiere subclases real. Eso no quiere decir que la subclase es definitivamente incorrecta en su caso, por supuesto, simplemente dándole opciones adicionales :)

+1

¿Podría definir "especialización" en este contexto? – MasterMastic

+0

@Ken: hacer que se comporte de una manera genuinamente * diferente *, p. ejecutando todos los manejadores en orden inverso. No solo "un botón que siempre tiene un controlador en particular". –

+0

Tiene sentido, gracias Jon! :) – MasterMastic

8

Siempre anule OnClick al heredar. Te da un mejor rendimiento.

+4

El rendimiento debe considerarse de importancia secundaria para la legibilidad en la mayoría de los casos, hasta que se haya demostrado que el impacto es significativo. No creo que la diferencia en el rendimiento sea significativa aquí (es bastante pequeña, y estamos hablando de * clic de botón * aquí, es decir, eventos relativamente infrecuentes). –

+0

No estoy diciendo que anular OnClick sea incorrecto, solo que el rendimiento no es la razón para hacerlo. –

+0

rendimiento para 1 controlador de eventos adicional es un poco ridículo – RvdK

-2

Por un clic del botón, lo mantendría como un método para leer. Pero creo que es una preferencia personal. Me interesaría ver qué es el consenso.

0

En realidad, hay una ventaja de asociar un controlador de eventos a la anulación de un método. Su controlador de eventos es privado, mientras que su método reemplazado tiene que ser protegido con un nombre predefinido. Si usa herramientas de ofuscación/encriptación para proteger su aplicación, su código estará más expuesto cuando sea protected override que cuando private.

Cuestiones relacionadas