Estoy escribiendo una aplicación web .NET en la que los administradores pueden personalizar los diversos formularios de entrada de datos presentados a sus usuarios. Hay aproximadamente media docena de tipos de campos diferentes que los administradores pueden crear y personalizar (por ejemplo, texto, numérico, menú desplegable, carga de archivos). Todos los campos comparten un conjunto de atributos/comportamientos básicos (¿se requiere el campo? ¿Tendrá un valor de campo predeterminado?). También hay una serie de atributos/comportamientos específicos de campo (es decir, el menú desplegable tiene un atributo de fuente de datos, pero el campo de texto no). Estoy dejando de lado muchas otras características del dominio del problema por simplicidad.método de sobrecarga y polimorfismo
La jerarquía de clases es simple: una superclase abstracta que encapsula comportamientos/atributos comunes y alrededor de media docena de subclases concretas que se ocupan de cosas específicas de campo.
Cada tipo de campo se procesa (es decir, se asigna a) como un tipo específico de control de servidor .NET, todos los cuales se derivan de System.Web.UI.Control.
creé el código siguiente para asignar los valores de los objetos de dominio entre el campo y su control de interfaz de usuario correspondiente:
public static void Bind(Control control, IList<DocumentFieldBase> fieldBaseList)
foreach (DocumentFieldBase fieldBase in fields){
if (typeof (DocumentFieldText).IsInstanceOfType(fieldBase)){
TextBox textbox = (TextBox) control;
textbox.Text = (fieldBase as DocumentFieldText).GetValue();
}
if (typeof (DocumentFieldDropDown).IsInstanceOfType(fieldBase)){
DropDown dropDown= (DropDown) control;
dropDown.Text = (fieldBase as DocumentFieldSelectOne).GetValue().Text;
dropDown.DataSource= (fieldBase as DocumentFieldSelectOne).DataSource;
dropDown.Id= (fieldBase as DocumentFieldSelectOne).GetValue().Id;
}
//more if statements left out for brevity
}
}
quiero para deshacerse de los malos si las declaraciones que realizan la comprobación de tipos. El enfoque para el que estaba filmando fue crear una sobrecarga de método para cada combinación de campo/control utilizando la tipificación de subclase. Por ejemplo:
public static void Bind(TextBox control, DocumentFieldText fieldText){
//some implementation code
}
public static void Bind(DropDown control, DocumentFieldDropDown fieldDropDown){
//some implementation code
}
Yo esperaba que entonces podría depender de .NET para llamar a la sobrecarga apropiada en tiempo de ejecución usando la subclase específica que se utiliza: Por ejemplo:
foreach (DocumentFieldBase field in fields){
Control control = FindControl(field.Identifier);
Bind(control, field)
}
Por desgracia, la el compilador se ahoga cuando intento esto: Argumento '1': no se puede convertir de 'System.Web.UI.Control' a 'TextBox'.
Si tengo que lanzar el primer argumento a TextBox, he vuelto a realizar una comprobación de tipo yo mismo y he derrotado el propósito de este ejercicio.
Es lo que estoy tratando de lograr a) posible yb) una buena idea?
Respuesta otorgada porque le pusiste un nombre a mi dolor :) A menudo he leído sobre el doble despacho y el patrón Visitor y tenía la corazonada de que ese era el problema (de ahí la etiqueta de "despacho" que mencionas). También ha logrado destilar las diferencias cruciales entre el despacho único y el despacho múltiple, algo que muchos de los artículos que he leído sobre el tema no pudieron hacer. –