GOOGLE ADS

martes, 26 de abril de 2022

Heredar controladores de eventos en C#

Me he acorralado en un rincón aquí.

Tengo una serie de UserControls que se heredan de un padre, que contiene un par de métodos y eventos para simplificar las cosas y no tener que escribir líneas y líneas de código casi idéntico. Como tu lo haces. El padre no contiene otros controles.

Lo que quiero hacer es simplemente tener un controlador de eventos, en el control de usuario principal, que va y hace cosas que solo el control principal puede hacer (es decir, llamar condicionalmente a un evento, como el evento está definido en el elemento principal). Luego conectaría este controlador de eventos a todos mis cuadros de entrada en mis controles secundarios, y los controles secundarios resolverían la tarea de analizar la entrada y decirle al control principal si lanzar ese evento. Agradable y limpio, sin código repetitivo de copiar y pegar (que para mí siempre resulta en un error).

Aquí está mi pregunta. Visual Studio cree que estoy siendo demasiado inteligente a la mitad y me advierte que "el método 'CheckReadiness' [el controlador de eventos en el padre] no puede ser el método para un evento porque una clase de la que deriva esta clase ya define el método". Sí, Visual Studio, ese es el punto. Quiero tener un controlador de eventos que solo maneje eventos lanzados por clases secundarias, y su único trabajo es permitirme conectar a los elementos secundarios sin tener que escribir una sola línea de código. No necesito esos controladores adicionales: toda la funcionalidad que necesito se llama naturalmente a medida que los niños procesan la entrada del usuario.

No estoy seguro de por qué Visual Studio comenzó a quejarse de esto ahora (ya que me permitió hacerlo antes), y no estoy seguro de cómo hacer que desaparezca. Preferiblemente, me gustaría hacerlo sin tener que definir un método que solo llame a CheckReadiness. ¿Qué está causando esta advertencia, qué está causando que aparezca ahora cuando no lo hizo hace una hora y cómo puedo hacer que desaparezca sin recurrir a hacer pequeños controladores en todas las clases secundarias?


Solución del problema

Declare el método principal virtual, anúlelo en las clases secundarias y llame

base.checkReadyness(sender, e);

(o derivación de la misma) desde dentro de la clase secundaria. Esto permite la evolución futura del diseño, por ejemplo, si desea realizar un código de verificación de error específico antes de llamar al controlador de eventos principal. Es posible que no necesite escribir millones de controladores de eventos como este para cada control, simplemente puede escribir uno, conectar todos los controles a este controlador de eventos que a su vez llama al controlador de eventos principal.

Una cosa que he notado es que si todo este código se coloca dentro de un dll, es posible que experimente un impacto en el rendimiento al intentar llamar a un controlador de eventos desde dentro de un dll.

No hay comentarios:

Publicar un comentario

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...