Duplicar posibles:
C# - Is there a better alternative than this to ‘switch on type’?mejor manera de cambiar el comportamiento basado en el tipo
Considérese el clásico:
class Widget { }
class RedWidget : Widget { }
class BlueWidget : Widget { }
En su mayor parte, en mi interfaz de usuario, lo puede tratar todos los Widget
s lo mismo. Sin embargo, hay diferencias menores, que necesito para if
o switch
a través de.
enfoques posibles:
Enumeración de los indicadores establecidos por - constructor
enum WidgetVariety { Red, Blue }
class Widget {
public WidgetVariety Variety { get; protected set; }
}
class RedWidget : Widget {
public RedWidget() {
Variety = Red;
}
}
// Likewise for BlueWidget...
switch (mywidget.Variety) {
case WidgetVariety.Red:
// Red specific GUI stuff
case WidgetVariety.Blue:
// Blue specific GUI stuff
}
Uso is
Widget w = ...;
if (w is RedWidget) {
(RedWidget)w ...
}
else if (w is BlueWidget) {
(BlueWidget)w ...
}
La razón por la que he recurrido a esto es 1) La mayor parte de el código ya está escrito de esta manera, pero mucho más feo. 2) El 90% del código es idéntico; básicamente, una sola columna en un GridView debe manejarse de manera diferente según el tipo.
¿Qué recomendarías? (O alguien tiene una solución mejor?)
Editar sé que probablemente se recomendó al patrón del visitante, sino que simplemente parece complicado para dispersas, pequeñas diferencias en este caso.
Editar 2 Así que una diferencia particular, yo estaba teniendo un tiempo difícil es la clasificación de esta columna que es diferente entre los dos tipos. En un caso, recupera un valor de bool
y lo asigna a la celda de la cuadrícula. En el otro caso, obtiene un valor de cadena.
supongo que en este caso, debería ser obvio que podría definir:
public object virtual GetColumn4Data();
public override GetColumn4Data() { return m_boolval; }
public override GetColumn4Data() { return m_mystring; }
esto se sentía mal a mí al principio, debido a la utilización de object
. Sin embargo, ese es el tipo de propiedad que estoy asignando en la celda, entonces por supuesto ¡esto tiene sentido!
demasiado tiempo en la oficina hoy parece ...
Parece que lo que dices es: dado que la mayoría del código ya está escrito mal, debes continuar la tendencia escribiendo un código más difícil de mantener. –
Si sus subclases tienen un tipo que varía entre ellas, entonces tal vez la clase base debe ser genérica. Luego se convierte en 'public virtual T GetColumn4Data(); ... public override bool GetColumn4Data() {return m_boolval; } ... public override string GetColumn4Data() {return m_mystring; } ' –
@Sahuagin - Guarde fragmentos de código más grandes para obtener respuestas. Los comentarios no les hacen justicia. –