[quote=YvGa][quote=Ataxexe]Tentei explicar mais ou menos os perigos da herança aqui:
É um blog que estou montando e ainda está em fase beta (põe beta nisso). Coloquei lá porque era muita coisa pra escrever (e eu ainda vou dar umas editadas depois).[/quote]
Muito bom!
Outro exemplo classico de como a herança pode enganar é o quadrado e o retangulo. Um quadrado é um retangulo, veja que ele passa no teste do é um.
Se o retangulo tem o setAltura e setComprimento, e voce herda o quadrado do retangulo, pois afinal um quadrado é um retangulo, voce começa a ter problemas. Porque se voce mudar a altura de 12 pra 10, enquanto voce nao mudar o comprimento voce não tem um quadrado. Pra resolver isso voce pode, ao alterar a altura fazer com seja alterado tambem o comprimento. Mas esse não é um comportamento esperado pelo cliente da classe. Ou você pode no classe filha criar um metodo setLado. Mas de um jeito ou de outro o princípio de Liskov pro buraco.
Se voce nao herdar o quadrado do retangulo, mas fazer com que um quadrado use um retangulo e tenha seu setLado, chamando setAltura e setComprimento do retangulo, você tem a sua implementação do quadrado independente do retangulo (como deve ser), sem criar no usuário do seu código a ilusão de que ele pode usar um como se fosse o outro.
Talvez seja eu quem não esteja enxergando tamanha simplicidade, mas o conceito de herança é muito complicado e fugir dele é sim uma ótima dica. Vamos abolir a herança? Não, mas vamos ter muito cuidado ao usá-la.[/quote]
Herdar um quadrado de um retangulo seria a coisa mais esquisita que já ouvi. Afinal quem deriva de quadrado é um retangulo. Esses erros de interpretação ao meu ver são no mínimo bizonhos com o perdão da palavra. É como querer derivar uma ave de uma galinha.
Isso é questão de bom senso. Se uma pessoa não consegue enxergar uma coisa dessas não tem jeito mesmo. Nem o “Maker” resolve.
Essa questão de herança não tem nenhum mistério ou complicação. Se voce tem em mente um modelo onde as hierarquias não são profundas(trocentos níveis), é sólida(tem o comportamento garantido por interfaces) e eficiente(não herda madeira de papel) ela será mais eficiente que a composição por deixar o código simples e enxuto.
*edit aqui - Um quadrado não é um retangulo.