Herança não funciona?

Fiquei muito intrigado com o post do Louds -> http://www.kumpera.net/blog/index.php/2007/11/13/heranca-nao-funciona/

Sem entrar nos méritos dos problemas que podem ocorrer, fiquei me perguntando como evitar a herança em um sistema aqui.
Tenho um sistema onde defini uma entidade Documento e uso herança para especializá-lo, existem entidades como RequisicaoVeiculo e ConviteApoio que são documentos de escopos distintos mas guardam comportamentos comuns por serem documentos oficiais da empresa como data, responsável, etc…

Como seria a melhor abordagem para evitar herança nesse caso (por meio de composição)?
Não consigo imaginar que a herança prejudica esse modelo, mas apenas como prova de conceito, como eu usaria composição para ter o mesmo comportamento que espero? fazendo RequisicaoVeiculo um agregado de Documento com metodos de manipulacao?

Ja pensou em usar o padrao Decorator?

Eu, particularmente, acho que afirmações radicais como aquela é que não funcionam.

O polimorfismo é uma das coisas que mais da poder a OO.
E isso é obtido também através de herança. Fora o reaproveitamento de código que a herança gera.

O que eu faço é evitar cadeias de herança muito longas (mais de 2 classes de “altura”).

O artigo mesmo fala sobre alguns problemas relacionados a herança. Eu prefiro atacar esses problemas, não questionar o mecanismo todo. Há várias coisas que funcionam, e até bem.

Boa idéia s4nchez, mas eu sempre vi o Decorator como “nuances diferentes para um mesmo comportamento”, na minha estrutura eu uso comportamentos diferentes mas com alguns dados em comun… como no caso de REquisicaoVeiculo compartilha dados em comum com AtaReuniao por exemplo!
mas é um caminho que eu não tinha pensando mesmo.

Saindo do foco da minha própria pergunta, só acho que nesse caso ficaria muito mais complexo e não me traria tantos benefícios claros, continuo ainda vendo a herança como algo positivo para esses casos.

Eu não lembro de ter usado herança com mais um nível de altura em toda minha vida, sempre usei para casos simples, eu sempre prefiro composição a herança mas para essa arquitetura particular eu achei a herança mais adequada…

acredito nisso tb… Há casos e casos…

Eu também procuro usar a herança quando eu tenho certeza absoluta de se tratar de uma especialização de tipos (como me parece ser o seu caso).

Herança quase funciona, o problema é fazer isso funcionar com destructive assigment e variancia - duas coisas de enorme grau de importancia para linguagens OO.

Na verdade, eu deveria ter dito “contornar esses problemas”.
Isso deve ser herança de programador C++ (onde driblar problemas é uma arte).

[quote=ViniGodoy]Na verdade, eu deveria ter dito “contornar esses problemas”.
Isso deve ser herança de programador C++ (onde driblar problemas é uma arte).[/quote]

Dribar, nesse caso, significa criar porcaria - sistemas unsound quase sempre.

That’s true.

Ainda assim, não creio que exista um “paradigma perfeito”, onde tudo será bem estruturado e bem programado, onde basta escrever para estar certo. Para isso estaríamos falando de máquinas perfeitas, com sistemas perfeitos e programadores perfeitos.

E isso não existe.

Claro, isso não é desculpa para não buscarmos essas coisas. Mas o programador atual tem que aprender a driblar, tem que aprender as vantagens e desvantagens de tudo o que faz e tem que balancear bem os trade-offs. E para isso, tem que conhecer as tecnologias que domina, se informar sobre as emergentes que ainda não domina, e estar aberto a novos paradigmas e conceitos.

Seu artigo é bacana? Claro, muito bacana. Mostra que a herança não é perfeita e onde ela não é perfeita. Também mostra as alternativas. Se nos informarmos mais sobre essas alternativas, também vamos achar desvantagens em cada uma delas, pois, até onde eu sei, nenhuma também é perfeita. Teremos aumento de complexidade ou falta de profissionais ou a necessidade de uma arquitetura maior, whatever. E daí entra os trade-offs que eu estava falando.