Li em um artigo que “Java não permite herança múltipla.”
Isso esta certo?
se eu tenho uma classe animal e outras 3 subclasses (cachorro, gato, papagaio) isso não é herança múltipla ???
ps: o artigo q estava lendo estava falando sobre thread, não sei se pode ser alguma coisa específica pra thread…
Como citaram anteriormente, quando é necessário sobrescrever métodos usa-se Interfaces.
Com o tempo vc verá que herança nao é tão egal assim.
Ate mais.
herbertins
usar interface e uma forma de obter baixo acoplamento. que eh o paradigma da orientaçao a objeto.
Jeferson_Flamini
Basicamente, vc utiliza herança quando quer aproveitar um comportamento já implementado de uma classe, como por exemplo se vc tiver uma classe que implementa um comportamento de um veiculo (método anda) e outra que implementa o comportamento de um Privada (método daDescarga) e vc quiser fazer uma privada que anda vc pode simplesmente criar uma nova Classe que herda as duas anteriores, aproveitando total o parcialmente os comportamentos implementados.
Já interfaces não implementam comportamento algum, e geralmente são utilizadas para reduzir o acoplamento permitindo que se estabeleça uma interface de comunicação entre classes diferentes. Por exemplo podemos ter uma inteface chamada Movimentacao que possui um método declarado movimenta(), ai podemos ter uma classe Peixe que implementa neste método movimenta o comportamento de nadar e uma outra classe Cachorro que implementa no metodo movimenta o compoprtamento de andar, desta maneira quem executar o método movimenta() não precisará saber se o objeto é um peixe ou um cachorro.
herbertins
exatamente, e isso eh muito melhor, o grande problema das heranças seria as heranças que nao tem nada haver como essa que vc acabou de colocar
exemplo
classe gato extends cachorro{
isso eh totalmenteee errado, so pq eles tem uma atributo 4 patas quer dizer que um gato é um cachorro…NUNCAAAAAAAAA
igual a que vc acabou de fazer
classe carro extends privada {
um carro eh uma privadaa…NAOOOOOOOOOOOOOOOOOOOOO
eh isso galera
Jeferson_Flamini
herbertins, acho que ai vc esta enganado. Se eu tiver que fazer uma privada que anda e poder reaproveitar os comportamentos de Veiculo e Privada, como no exemplo, não vejo problema algum. Um outro exemplo seria um telefone do tipo Nextel, que tem os comportamentos de Telefone e Rádio, ou um Celular qualquer com MP3 que também herdaria Telefone e Player (sem uma relação direta como vc propos).
O principal problema de herança multipla em C++ por exemplo (já que java não suporta) é quando temos métodos com mesma assinatura em ambas Classes herdadas. Para isto as Linguagens que suportam este tipo de contrução acabam gerando mecanismos de resolução que são muito particulares.
herbertins
exatamente por isso que o livro designer patterns diz que se possivel evite usar heranças, para que nao ocorra isso o uso de heranças erradas.
no casa de um celular vc poderia implementar uma interface players por exemplo onde um celular implementaria e um walkman sei lah alguma coisa do tipo poderia implementar.
o relacionamento da herança é o “é um” ow seja um celular nao é um player ele implementa um player.
E
ezellis
Jeferson no seu primeiro exemplo “privada q anda” vc disse q a nov classe deveris implementar as duas anteriores (privada e andar), mas é justamente ai que ocorreria a herança múltipla.
Jeferson_Flamini
Jeferson Flamini:
vc quiser fazer uma privada que anda vc pode simplesmente criar uma nova Classe que herda as duas anteriores, aproveitando total o parcialmente os comportamentos implementados.
Exatamente ezellis, só que eu disse que a PrivadaQueAnda herda as outras duas. Vc usa extends em java, só que somente é permitido uma classe na contrução, ou em C++ ficaria algo do tipo:
classPrivadaQueAnda:Privada,Veiculo {
}
Para fazer isto em Java, vc pode fazer alguma coisa do tipo:
classPrivadaQueAndaextendsPrivadaimplementsVeiculo{privateVeiculov=newVeiculo();publicvoidanda(){// este é o método presente na interface de veículov.anda();// este é o método anda do Objeto veículo agregado a classe }}
E
ezellis
jeferson na verdade teria que extender uma classe e implementar a outra?
então veículo deveria ser uma interface e não uma classe, é isso mesmo?
herbertins
eh isso mesmo.
pcalcado
Concordo com o Jeferson.
O paradigma OO nao é baixo acoplamento, ele o possibilita.
De qualquer modo itnerfaces não substituem herança múltimpla, uma interface é um contrato, você não consegue reuso do códigod e uma classe-pai.
Que favorecer composição á herança é uma prática louvável é verdade mas vfazê-lo sem pensar é simplesmente desperdiçar toda a infra-estrutura provida pela Orientação aa Objetos.
Jeferson_Flamini
é isto mesmo ezellis, acho que o exemplo abaixo é mais completo para uma das possíveis implementações.
interfaceIVeiculo{publicvoidanda();}classVeiculoimplementsIVeiculo{publicvoidanda(){...// a implementação}}classPrivadaQueAndaextendsPrivadaimplementsIVeiculo{privateVeiculov=newVeiculo();publicvoidanda(){// este é o método presente na interface de veículov.anda();// este é o método anda do Objeto veículo agregado a classe }}
herbertins
cara devo ter errado em algum conceito e tal, mais para min usar uma classe do tipo [color=red]cachorro extend gato [/color]seria uma coisa alem de horrivel, nao faz o menor sentido
nao estou dizendo que estou certo, na verdade nao existe o certo e o errado e sim as boas praticas de programaçao. e pelo que eu aprendi criar uma herança desse tipo eh uma pessima pratica de programaçao.
e outra usar orientaçao a objetos nao significa escrever menos código.
abs.
se eu estiver falando alguma bobeira podem me falar, na verdade sou novato tbm e entrando nessas discuçoes eu acabo aprendendo mais, e esse eh meu objetivo aqui.
pcalcado
Bom, sim, você está falando besteira.
Cachorro estendendo Gato não é sequer exemplo de herança múltipla. Herança múltipla seria algo como Cachorro extends AnimalTerrestre, Mamifero. Cachorro e Gato no exemplo são exemplos de… falta de noção ao definir uma hierarquia.
Jeferson_Flamini
Hebert, entendo perfeitamente sua colocação. Pensando no que representaria uma Classe Cachorro e uma classe Gato, seria estranho para um mundo como o nosso onde estes animais podem parecer muito diferentes. Mas se vc não soubesse como são tais animais, vc teria que descobrir seus características perguntando ao usuário e se durante sua pesquisa ele simplesmente lhe disser que os dois comem, os dois andam, os dois dormem, os dois tem pulgas, e estas caracterísitcas fossem as únicas que vc tivesse que implementar, vc concorda que um Cacchorro neste caso é um gato?
Desta maneira não importa o quão diferente são estes animais, mas sim, dentro daquilo que vc tem que implementar, quanto eles são iguais.
Hoje um cão pode ser diferente de um gato, mas quem sabe no futuro possamos ter mutações onde ocorrerão coisas do tipo CaGato ou Gachorro. Este então poderá ser um caso de herança multipla.
pcalcado
Jeferson,
Generalizar com uma abstração conhecida é complicado. Para todos nós que conhecemos o que é um cachorro e o que é um gato essa ssociação não faz sentido ams realmente quem diz isso é o domínio e os experts nele.
Acotnece que este exemplo só está trazendo confusão já que todo mundo sabe o que é um cachorro e um gato. [size=18]Fora que de herança multipla isso não tem nada.[/size]
herbertins
pcalcado:
Bom, sim, você está falando besteira.
Cachorro estendendo Gato não é sequer exemplo de herança múltipla. Herança múltipla seria algo como Cachorro extends AnimalTerrestre, Mamifero. Cachorro e Gato no exemplo são exemplos de… falta de noção ao definir uma hierarquia.
descum mais nao foi no intuito de definir heranças multiplas que dei esse exemplo e sim no intuito de dizer que nem sempre eh uma boa pratica escrever heranças. na verdade a nossa discuçao acabou fugindo um pouco do assunto do topico.
na verdade soh quis dizer que nem sempre eh interessante usar uma herança soh para escrever algumas linhas a menos de código.
Jeferson_Flamini
hehehe, vc esta correto Phillip.
Acho que um exemplo melhor pode ser aquele do rádio relógio. (este acho que é auto-explicativo )
herbertins
e outra eh exatamente isso que estava falando que nao tem sentido algum o um cara criar uma classe carro que tem um metodo ande e outro classe privada que extende a classe carro soh pq ele quer que a privada ande.
peczenyj
herança pode quebrar o encapsulamento. herança multipla então…
herança multipla vc pode ter problemas como o diamante mortal. é claro que pode ser contornado, mas pra que? java se desenvolveu tanto sem isso…
pcalcado
Java também se desenvolveu sem DBC, blocos, uma biblioteca de IO e datas decente… por isso estes são ruins ou dispensáveis?
C se desenvolveu tanto sem OO, sem memória gerenciada automaticamente… por isso estes são ruins?
Após ler textos clássicos de OO você descobre duas coisas:
1 - Herança Multipla é básico para OO
2 - Quase ninguém conhece OO então esconder estar armas pode evitar umas balas perdidas
pcalcado
BTW, herança não quebra o encapsulamento se bem planejada com um contrato bem definido, ela aumenta o acoplamento entre as classes.
peczenyj
Herança Multipla é básico para OO
Mas apenas segundo textos clássicos ?
pcalcado
Não entendi.
peczenyj
Para textos ditos ‘modernos’ , Herança Multipla tambem é básica para OO?
pcalcado
O que é um texto moderno para você?
Qual foi a última vez que leu algo que falasse de OO sem ser influenciado por Java ou C#, como se as características destas linguagens fossem as características de OOP?