Bom pessoal, estava dando uma revisada em Orientação a objetos, quando me surgiu uma dúvida: O fato de uma subclasse sobrescrever VÁRIOS métodos de sua superclasse caracteriza um mal uso de herança? Pois se uma classe A(superclasse) expõe padrões de comportamentos para uma classe B(subclasse), a medida que B sobrescreve os métodos (comportamentos) de A, esses “padrões de comportamentos” vão deixando de existir, tornando a classe B com um comportamento diferente da classe A.
Como vocês veem essa questão da Herança? No máximo, quantos métodos sobrescritos devem existir em uma subclasse para se manter uma ‘herança saudável’?
Estou usando a seguinte abordagem: no máximo 2 métodos sobrescritos, a partir do 3º eu já começo a pensar em Interfacear.
Eu não acho! Pode ser um mal cheiro que indique que talvez essa subclasse que utilza a superclasse pode tentar utilizar composição… (clichê)
Sim, essa é uma ideia do reuso, substiuir as partes que não te servem. (claro, com cautela)
fredericoengels:
Como vocês veem essa questão da Herança? No máximo, quantos métodos sobrescritos devem existir em uma subclasse para se manter uma ‘herança saudável’?
Estou usando a seguinte abordagem: no máximo 2 métodos sobrescritos, a partir do 3º eu já começo a pensar em Interfacear.
Acho que não existe essa coisa de herança saudável ou mesmo quantidade de métodos sobrescritos… melhor mesmo seria compor isso tudo seja por interfaces ou por objetos mesmo.
Há n livros que tratam desse assunto com profundeza, mas a regra geral é
pensou em herança
para e pense
ainda acha que é herança (é mesmo um do tipo, não está querendo apenas aproveitar o código? se for aproveitar, composição)
ainda acha que é herança ?
dá pra fazer com composição?
USE composição rsrsr, brincadeira, mas tente usar herança só para É UM TIPO e não para reaproveitar código.
Já vi código muito bom com Pessoa PessoaFisica e PessoaJuridica só com composição, já vi código bom que há controladores e você herda os comportamentos e sobreescreve… enfim o tempo e a experiencia (livros, fóruns) vão te deixar mais relaxado para saber quando usar um ou outro.
marvinla
Na minha percepção, a herança não deve ser usada se o único objetivo é o reaproveitamento de código.
E mesmo quando há o relacionamento É-UM, deve-se tomar cuidado para não alterar o comportamento da superclasse. Pra mim, não importa se a implementação mudar, desde que se mantenha o comportamento original (princípio de substituição de Liskov).
Há também o caso de caso de classes projetadas para herança (Effective Java), e nesses casos, não há problemas em sobrescrever muitos métodos. De fato, você deverá sobrescrevê-los.
Giulliano
Vc esta quase caindo no problema resolvido pelo padrão “Template Method”.
Onde uma classe descreve algumas funcionalidades e delega o resto para suas filhas. Não é exatamente o que vc disse, mas está quase lá.