En el pasado, he usado la herencia para permitir la extensión de formularios de Windows en mi aplicación. Si todos mis formularios tuvieran controles, ilustraciones y funcionalidad comunes, crearía un formulario base que implementara los controles y la funcionalidad comunes y luego permitiría que otros controles heredaran de ese formulario base. Sin embargo, me he encontrado con algunos problemas con ese diseño.
Los controles solo pueden estar en un contenedor a la vez, por lo que cualquier control estático que tenga será complicado. Por ejemplo: suponga que tiene un formulario base llamado BaseForm que contiene un TreeView que crea protegido y estático para que todas las demás instancias (derivadas) de esta clase puedan modificar y mostrar el mismo TreeView. Esto no funcionaría para múltiples clases heredadas de BaseForm, porque ese TreeView solo puede estar en un contenedor a la vez. Probablemente estaría en la última forma inicializada. Aunque cada instancia podría editar el control, solo se mostraría en uno en un momento dado. Por supuesto, hay soluciones alternativas, pero todas son feas. (Esto parece ser un diseño realmente malo para mí. ¿Por qué varios contenedores no pueden almacenar punteros en el mismo objeto? De todos modos, es lo que es).
Estado entre formularios, es decir, estados de botón, texto de etiqueta, etc., tengo que usar variables globales para restablecer los estados en Load.
Esto realmente no es muy compatible con el diseñador de Visual Studio.
¿Existe un diseño mejor, pero aún fácil de mantener para usar? ¿O la herencia de formas sigue siendo el mejor enfoque?
Actualización Pasé de mirar MVC a MVP al patrón de observador al patrón de evento. Esto es lo que estoy pensando por el momento, por favor critique:
Mi clase BaseForm solo contendrá los controles y los eventos conectados a esos controles. Todos los eventos que necesitan algún tipo de lógica para manejarlos pasarán inmediatamente a la clase BaseFormPresenter. Esta clase manejará los datos de la IU, realizará cualquier operación lógica y luego actualizará el BaseFormModel. El Modelo expondrá eventos, que se dispararán en caso de cambios de estado, a la clase Presentador, a la que se suscribirá (u observará). Cuando el presentador recibe la notificación del evento, realizará cualquier lógica, y luego el presentador modificará la vista en consecuencia.
Solo habrá una de cada clase de Modelo en la memoria, pero podría haber muchas instancias de BaseForm y, por lo tanto, BaseFormPresenter. Esto resolvería mi problema de sincronizar cada instancia de BaseForm con el mismo modelo de datos.
Preguntas:
¿Qué capa debería almacenar cosas como, el último botón presionado, para que pueda mantenerlo resaltado para el usuario (como en un menú CSS) entre formularios?
Por favor critica este diseño. ¡Gracias por tu ayuda!