Alterações de Design de Classe Base Após a Implementação
Idealmente, hierarquias de classe nunca mudam após a implementação, pois mesmo pequenas mudanças arriscam consequências não intencionais.Na realidade, essas alterações às vezes são inevitáveis: requisitos do produto podem alterar e especificações de design, às vezes, omitir elementos-chave.Uma categoria de problemas de herança é chamada de problema de classe base frágil.
O Problema da Classe Base Frágil
A principal desvantagem no uso de hierarquias de herança é um problema chamado classes base frágeis. Alterações em classes base geralmente exigem que a classe base e todo o código em classes derivadas seja alterado, recompilado e redistribuído.Esse problema é ainda mais difícil quando vários desenvolvedores criam a classe base e classes derivadas, porque cada parte pode negar o acesso a seus códigos-fonte.Em um cenário pior, um cliente pode inadvertidamente usar a forma binária compilada de uma classe base atualizada com a versão binária original e incompatível das classes derivadas.
Alterações na classe base que podem quebrar classes derivadas incluem substituição ou alteração nos tipos de dados de membros da classe base.
Minimizando Problemas de Classe Base Frágil
A melhor maneira para evitar o problema de classes base frágeis é fazer alterações somente em classes derivadas.No entanto, isso nem sempre é possível, porque requer que você considere cada possibilidade quando a classe base é lançada pela primeira vez; apesar dos melhores esforços, alterações imprevistas da classe base são às vezes inevitáveis.
O uso de classes MustInherit e métodos MustOverride ajuda a reduzir problemas de classe base frágil, já que isto move detalhes de implementação para classes derivadas e reduz a necessidade de alterações na classe base.Novamente, no entanto, isso não é sempre possível, mesmo com o melhor planejamento.
Membros de dados sombreados em classes derivadas também são úteis, pois eles reduzem conflitos de nomes com membros da classe base.
A maneira mais segura para estender a funcionalidade de um classe base é adicionar novos membros.A única maneira com que novos membros podem quebrar um classe base é se a classe derivada usa a palavra-chave Overloads para herdar os métodos da classe base e introduz novos métodos com o mesmo nome.Esse problema pode ser evitado especificando-se explicitamente na classe derivada quais métodos da classe base você deseja herdar, redefinindo esses métodos e delegando a eles.
De certo modo, todas as classes base são frágeis em algum grau.Em última análise, o problema de classes base frágeis não pode ser eliminado, mas ele pode ser minimizado através do design cuidadoso de hierarquias de classe, que reduz a necessidade de alterações na classe base, e do teste completo quando tais alterações forem inevitáveis.