La reducción a la baja se considera mala por un par de razones. Principalmente pienso porque es anti-OOP.
OOP realmente me gustaría si nunca tuvieras que abatir, ya que su "razón de ser" es que el polimorfismo significa que no tienes que ir
if(object is X)
{
//do the thing we do with X's
}
else
{
//of the thing we do with Y's
}
simplemente haces
x.DoThing()
y el código automáticamente hace lo correcto.
Hay algunas razones "difíciles" para no abatirse:
- En C ++ es lento.
- Obtiene un error de tiempo de ejecución si elige el tipo incorrecto.
Pero la alternativa a la reducción de emisiones en algunos escenarios puede ser bastante fea.
El ejemplo clásico es el procesamiento de mensajes, en el que no desea agregar la función de procesamiento al objeto, sino mantenerlo en el procesador de mensajes. Luego tengo una tonelada de MessageBaseClass
en una matriz para procesar, pero también necesito cada una por subtipo para el procesamiento correcto.
Puedes usar Double Dispatch para solucionar el problema ( enlace ) ... Pero eso también tiene sus problemas. O simplemente puede abatirse por un código simple a riesgo de esas razones difíciles.
Pero esto fue antes de que se inventaran los genéricos. Ahora puede evitar el derribo al proporcionar un tipo donde los detalles se especifican más adelante.
MessageProccesor<T>
puede variar los parámetros de su método y los valores de retorno según el tipo especificado pero aún así proporcionar una funcionalidad genérica
Por supuesto, nadie te obliga a escribir código OOP y hay muchas características de lenguaje que se proporcionan pero que no están bien vistas, como la reflexión.