Downcasting é impopular, talvez um cheiro de código
Discordo. Downcasting é extremamente popular ; um grande número de programas do mundo real contém um ou mais downcasts. E talvez não seja um cheiro de código. Definitivamente, é um cheiro de código. É por isso que a operação de downcast deve se manifestar no texto do programa . É para que você possa notar mais facilmente o cheiro e passar a atenção da revisão do código.
em que circunstância (s) é apropriado escrever código que faça downcasts?
Em qualquer circunstância em que:
- você tem um conhecimento 100% correto de um fato sobre o tipo de tempo de execução de uma expressão que é mais específico que o tipo de expressão em tempo de compilação e
- você precisa aproveitar esse fato para usar um recurso do objeto não disponível no tipo de tempo de compilação e
- é melhor usar o tempo e o esforço para escrever o elenco do que refatorar o programa para eliminar qualquer um dos dois primeiros pontos.
Se você pode refatorar um programa de forma barata para que o tipo de tempo de execução possa ser deduzido pelo compilador ou refatorar o programa para que você não precise da capacidade do tipo mais derivado, faça-o. Os downcasts foram adicionados ao idioma nas circunstâncias em que é difícil e caro refatorar o programa.
por que o downcasting é suportado pelo idioma?
O C # foi inventado por programadores pragmáticos que têm trabalhos a fazer, para programadores pragmáticos que têm trabalhos a fazer. Os designers de C # não são puristas de OO. E o sistema do tipo C # não é perfeito; por design, subestima as restrições que podem ser colocadas no tipo de tempo de execução de uma variável.
Além disso, o downcasting é muito seguro em c #. Temos uma forte garantia de que o downcast será verificado no tempo de execução e, se não puder ser verificado, o programa fará a coisa certa e trava. Isso é maravilhoso; significa que, se seu entendimento 100% correto da semântica de tipos estiver 99,99% correto, seu programa funcionará 99,99% do tempo e trava o resto do tempo, em vez de se comportar de forma imprevisível e corromper os dados do usuário em 0,01% .
EXERCÍCIO: Há pelo menos uma maneira de produzir um downcast em C # sem usar um operador de conversão explícito. Você consegue pensar em tais cenários? Como esses também são odores de código em potencial, que fatores de design você acha que foram para o design de um recurso que poderia produzir uma falha de downcast sem ter um manifesto convertido no código?