Eu tenho codificado por cerca de 8 anos, mas ainda acho que a herança é muito flexível e, às vezes, deixa você totalmente confuso com o código que escreveu. Um exemplo mais simples seria:
abstract class AClass {
protected void method1() {
if(check()) {
do1();
} else {
do2();
}
}
protected abstract void do1();
protected abstract void do2();
}
A intenção da classe é que as pessoas possam implementar do1 () e do2 () para que alguma lógica adicional possa ser feita; no entanto, às vezes, as pessoas decidem sobrecarregar o método1 (), e as coisas se complicam imediatamente.
Acho apenas no padrão de estratégia que o código é reutilizado bem por meio da herança; na maioria dos casos, o designer da classe base conhece muito bem suas subclasses, e essa herança é totalmente opcional.
Eu tenho uma classe que é herdada por 4 classes - um IoHandler, e é subclasse para servidor, cliente, servidor de borda, servidor de origem e isso começa a me deixar louco. Eu estava sempre na refatoração de código, sempre tive idéias que acho que funcionariam e depois não foram comprovadas. Dizem que o cérebro humano pode armazenar apenas sete informações uma vez, estou carregando muitas?
final
[se você estiver usando java]. Isso efetivamente o torna não virtual e não pode ser sobrecarregado. Perfeito para uso nesta circunstância [configuração padrão]