Estoy luchando con una situación que vuelvo a repetir una y otra vez, pero no estoy seguro de si la forma en que estoy haciendo las cosas está mal o si podría estar haciendo las cosas de otra manera.Uso de Windows Form como clase abstracta: ¿qué patrón usar?
Un ejemplo:
Tengo un formulario Windows Forms que tiene un DataGridView con algunos métodos particulares para llevar a cabo la validación de la cuadrícula de datos e interpretación de clics de ratón derecho en el DataGridView etc. Esta forma de ventanas es esencialmente una clase de "abstracto" y nunca se crea una instancia directamente.
Luego heredo de esta clase base y la personalizo de varias maneras (patrón de plantilla) p. defina las columnas de la vista de cuadrícula de datos y los métodos particulares de formateo que son específicos de esas columnas, etc.
Cuando consumo estas clases, los métodos públicos de la clase base forman mi interfaz y puedo instanciar el tipo particular de datagridview que quiero y manipularlo a través de la interfaz común. Encantador.
El problema:
El problema principal es que la realidad no se puede declarar una clase de formularios Windows tan abstracto sin causar el diseñador de Visual Studio para lanzar una tambaleante ya que no puede crear instancias de estas clases abstractas.
algunas soluciones:
En este momento estoy "de ejecución" esos métodos en la clase base que quiero ser anulados con:
throw new NotSupportedException();
así que al menos si olvido para anular una de estos métodos que forman mi interfaz. Sin embargo, esto me parece mal y no me gusta.
Otra solución con la que jugué fue eliminar por completo la herencia y definir una interfaz (por ejemplo, IMyDataGrid) e implementarla en cada clase de grid de datos (tipo de patrón de estrategia). El problema aquí es que usted pierde los beneficios de la reutilización de código que le da herencia, lo que significa que tiene que crear muchas formas diferentes, colocar una vista de tabla de datos en ellas, copiar y pegar efectivamente el mismo código en cada una. Malo.
¿Hay una mejor manera de tratar de lograr esto?
¿Por qué no heredar directamente de GridView y crear un control para usar en Windows Form? – Macros