| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2007 13:33:30
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
leandros wrote:Motivo de Java não ter herança múltipla é por causa do efeito Diamante que pode acontecer no Design.
Eu pensei em responder algo assim. Mas não concordo.
O compilador C++ fez uma solução simplista para o problema, mas o Java poderia partir para algo mais inteligente.
Para quem não sabe do problema, conside as classes:
Veiculo
Naval extends Veiculo
Terrestre extends Veiculo
Anfibio extends Terrestre, Naval
A classe veículo é pai de Anfíbio 2 vezes, uma delas através de Naval e outra através de Terrestre. No C++ isso é um problema, pois o compilador gerará efetivamente duas cópias da classe veículo.
O que acho que deveria acontecer, e é o que parece lógico, é que veículo não se duplicasse. Afinal, veículo é apenas uma classe.
Outro problema da herança múltipla, e aí sim, é um problema sério é o conflito de nomes. Ainda naquele diagrama. Considere que tanto a classe Naval quanto Terrestre tem um método com o mesmo nome, digamos, getMotor(). Entretanto, esse método é radicalmente diferente nas duas implementações. A grande questão é... o que fazer com ele?
Com interfaces, isso não é um problema, pois interfaces não tem implementações. Uma coisa que o java poderia fazer é impedir herança quando isso acontecesse. Ou limitasse isso para quando as classes implementassem uma interface comum e ainda obrigasse o programador a implementar alguma coisa no método conflitante. Acharam complicado?
Agora, o que fazer com campos protected conflitantes? Shadowing de um deles? Eliminar um dos campos? Impedir?
Em resumo, herança múltipla é um recurso complexo e de benefício muito questionável. Geralmente complica o design e quase sempre pode ser evitado. Então, para que ter isso na linguagem? Para agradar 10% dos programadores? Mas será que isso é justificativa para complicar a vida dos outros 90%?
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2007 13:50:01
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
pcalcado wrote:Ahm.. não.
Interfaces são contratos. Uma interface não cria o relacionamento que existe entre uma classe e sua superclasse como obediência á Liskov Substitution Principle, uma classe abstrata sim. interfaces são recursos para garantir que classes possuam uma "interface" (uma API) comum.
Sim... sim... aqui estou usando o termo "Abstract Base Class" (ABCs) do mundo C++. Não confundir simplesmente com "Classe abstrata" do java. Eles são bem enfáticos em dizer que devem só conter métodos virtuais puros (ou seja, sem implementação), para que exprimam somente a funcionalidade exprimida pela ABC (em resumo, um contrato). Além do mais, quando se trata de uma herança múltipla com duas ABCs puras, o C++ não recai no problema do Diamond-of-Death. Existe código no compilador específico para isso. Aliás, sobre isso, recomendo a entrevista com o próprio autor do Effective C++:
http://www.artima.com/intv/abcs.html
Mas concordo, não é um conceito idêntico. E sempre há o risco de alguém começar a colocar código na ABC, quebrando todo conceito da arquitetura.
pcalcado wrote:
Acho que você quis dizer composição e não acomplamento, certo? De qualquer modo, herança múltipla não implica emg randes hierarquias ou vice-versa.
É, foi o que eu quis dizer.
Realmente, herança múltipla não implica em grandes hierarquias. Mas as favorece. Especialmente o que se faz com "mixing classes", que são classes de utilidade pequena, desenhadas justamente para se misturarem a outras. E as mixing classes estão sujeitas a todos os problemas da herança múltipla, inclusive os conflitos de nomes que citei ali em cima.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2007 14:58:01
|
J2Alex
JavaEvangelist
![[Avatar]](/images/avatar/f4be00279ee2e0a53eafdaa94a151e2c.png)
Membro desde: 18/01/2003 08:14:41
Mensagens: 348
Localização: São José dos Campos
Offline
|
AndrewAguiar wrote:Não ha erro algum na modelagem, e o fato de ele poder ser um ativo em determinada ocasião torna ele um ativo.
Talvez eu não tenha sido claro, mas o que eu quis dizer é que ele pode fazer parte do ativo num determinado momento, mas isso não o torna um ativo. O ativo possui um helicóptero, o relacionamento TEM UM é mais correto, mais coerente. Continuo achando que há erro na modelagem.
Ou a idéia é usar herança simplesmente para digitar menos código? Essa não é a melhor forma de se usar herança.
Quanto a comportamentos comuns você pode separá-los usando strategy.
Ah... e o exemplo da interface CharSequence foi infeliz, uma String não é nada mais que uma sequência de caracteres, então pode ser tratado dessa forma sem problemas.
|
Alexandre
Hoje tem Balada
https://apps.facebook.com/hojetembalada
Guia colaborativo de baladas, bares e restaurantes |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2007 15:53:27
|
fabio.patricio
GUJ Master
Membro desde: 04/01/2004 02:51:33
Mensagens: 1512
Localização: Porto Alegre - RS
Offline
|
Duvida...e na hora que o Helicoptero não tiver mais serventia e virar um Passivo o que fazer?
]['s
|
Fabio Patricio
http://blog.wansoft.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2007 16:09:03
|
AndrewAguiar
JavaChild
Membro desde: 18/07/2006 10:03:59
Mensagens: 124
Offline
|
É o exemplo do Ativo e do Helicoptero não foi dos melhores, não tinha pensado nisto.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2007 16:37:32
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
Sobre Diamanete, isso é estupidamente simples de resolver com linguagens estaticamente tipadas: Exija do programador que informe qual implementação ele quer se não sobrescrever o método.
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2007 16:57:04
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
pcalcado wrote:Sobre Diamanete, isso é estupidamente simples de resolver com linguagens estaticamente tipadas: Exija do programador que informe qual implementação ele quer se não sobrescrever o método.
Eu não simplificaria tanto assim. Há situações em que ambos os métodos são importantes.
E há as situações em que existem atributos protected (seja através de um getter protected ou de acesso direto), que devem ser modificados. Nesse caso, o que fazer? A alternativa C++ é indicar o caminho completo até o atributo.
Seja o que for... não vai ficar uma solução das mais elegantes e certamente vai rebuscar a hierarquia. Para não falar na legibilidade do código.
E tudo isso, para um recurso cujo real benefício é muito duvidoso, mas que a grande quantidade de problemas é bastante conhecida...
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2007 17:04:08
|
Luca
Moderador
![[Avatar]](/images/avatar/17e62166fc8586dfa4d1bc0e1742c08b.jpg)
Membro desde: 06/09/2002 14:30:10
Mensagens: 5810
Localização: São Paulo/SP ou Paraty/RJ
Offline
|
Olá
leandros wrote:Motivo de Java não ter herança múltipla é por causa do efeito Diamante que pode acontecer no Design.
Ponto para você!
Sem querer me meter muito nesta discussão só vou dar um depoimento porque assisti ao nascimento do Java e me lembro bem dos argumentos que usavam para não ter herança múltipla.
Um deles e geralmente o primeiro citado, é justamente este. No livro The Java Programming Language do Ken Arnold e James Gosling da série The Java Series From The Source de 1996, no item 4.2 Single Inheritance versus Multiple Inheritance, logo no segundo parágrafo, depois de definir herança múltipla, aparece a tal figurinha do diamante onde W é super classe de X e Y e Z herda de X e de Y ao mesmo tempo. Em seguida a figura está o texto abaixo:
4.2 Single Inheritance versus Multiple Inheritance de The Java Programming Language, 1a ed. de 1996 wrote:
This is commonly called "diamond inheritance", and there is nothing wrong with it. Many legitimate designs show this structure. The problems exist in the inheritance of implementation, when W's implementation stores some state. If class W had, for example, a public field named goggin, and if you had a reference to an object of type Z called zref, what would zref.goggin refer to? It might refer to X's copy of goggin, or it might refer to Y's copy, or X and Y might share a single copy of goggin because Z is really only a W once even though it is both an X and a Y.
Java uses the single-inheritance model of object-oriented programming to avoid such issues.
Single inheritance precludes some useful and correct designs. The problems of multiple inheritance arise from multiple inheritance of implementation, so Java provides a way to inherit a contract without inheriting implementation. The way is to declare as interface type, instead of a class type.
Isto é história, não é especulação.
[]s
Luca
|
Dare Obasanjo (Program Manager at Microsoft)
"The folks I know from across the industry who have to build large scale Web services on the Web today at Google, Yahoo!, Facebook, Windows Live, Amazon, etc are using RESTful Web services. The only times I encounter someone with good things to say about WS-* is if it is their job to pimp these technologies or they have already "invested" in WS-* and want to defend that investment."
CEP, JMS, JMX e coisas afins (ou não)
http://lucabastos.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2007 17:17:44
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
ViniGodoy wrote:..
Por isso que falei que quando não for sobrescrito deve decidir qual implementação utilizar. Veja o que Bertrand Meyer diz a respeito:
http://archive.eiffel.com/doc/manuals/technology/bmarticles/joop/multiple.html wrote:
But what about name clashes?
Whenever you talk about multiple inheritance, someone is bound to ask sooner or later (usually sooner) what happens in the case of name clashes -- identically named features in two or more parent classes.
No doubt the question is legitimate, but the gravity with which it is asked -- as if it were a deep conceptual issue -- has been an unending source of bewilderment to me. I believe it is one of these cases in which if you only take a minute or two to pose the problem cleanly then the solution follows immediately. (If you don't, you can spend the rest of your life and ten PhD theses on the subject.)
Assume you are in the inheritance-based reusability business and combine classes from two software suppliers, say one in New York and one in London. Sure enough, one day you are going to run into the problem of combining two classes that both have a feature called foo, to use as example one of these nice evocative names that programmers are fond of.
But this is not a conceptual problem! It merely results from an unfortunate choice of names. If the parent programmers had chosen other names, differing by just one letter -- influenced perhaps by local conditions, they might have used zoo in New York and fog in London --, the problem would never have arisen.
This suggests the two key observations on this problem:
* First, it is purely a syntactical problem, due to conflicting name choices. It has nothing to do with the fundamental properties of the classes involved.
* Second, nothing is wrong with the parents; each is perfectly consistent as it stands. The "culprit" is the common heir, which tries to combine two classes that are incompatible as they stand. So the heir should also be responsible for the solution.
The Eiffel technique follows from these comments. We certainly don't want to leave any ambiguity; a class (which should be a clean implementation of an abstract data type) should present to its clients a clean and consistent interface. So if it inherits from two classes with an identically named feature and doesn't do anything about it, it is incorrect and will be rejected by the compiler with a message pointing to the ambiguity and saying in effect: "Won't you make up your mind? Do you want foo from New York or foo from London?" (The actual compiler message, needless to say, uses a more restrained tone.)
To overcome the situation, the designer of the common heir may use the straightforward Eiffel technique of renaming, as illustrated by the following example:
class SANTA_BARBARA inherit
LONDON
rename foo as fog
NEW_YORK
rename foo as zoo
feature
...
end -- class SANTA_BARBARA
Of course it suffices to rename one of the clashing features to remove the ambiguity.
Simples.
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2007 17:20:52
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
Luca wrote:
Isto é história, não é especulação.
Acho que quase todo mundo já tinha lido esta desculpa do Gosling, Luca, o ponto é que ela é esfarrapada. Dá pra resolver o problema de maneira muito simples e o argumento contra herança multipla contraria boa parte da teoria de OOP, a questão é que balanceando a solução com os benefícios de heranca multipla provavelmente acharam que nao vale a pena.
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2007 20:30:18
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
pcalcado wrote:
Acho que quase todo mundo já tinha lido esta desculpa do Gosling, Luca, o ponto é que ela é esfarrapada. Dá pra resolver o problema de maneira muito simples e o argumento contra herança multipla contraria boa parte da teoria de OOP, a questão é que balanceando a solução com os benefícios de heranca multipla provavelmente acharam que nao vale a pena.
Taí, concordo em gênero, número e grau.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2007 20:49:26
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
ViniGodoy wrote:
Taí, concordo em gênero, número e grau.
Complementando: nao sei se estao certos ou nao. Java tende a se tornar uma kitchen sink language e ai isso faz falta mas nos ultimos dez anos nao tem feito. Talvez seja mais uma coisa a atrapalhar a evoluçao, nao sei.
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
|
|