herança múltipla

32 respostas
E

Boa tarde,

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…

alguém poderia me ajudar a entender?

obrigado

32 Respostas

P

Isso que você citou não é herança múltipla.

Herança múltipla seria se uma classe fizesse extends de mais de uma classe.

No seu caso, cachorro extends animal
gato extends animal
papagaio extends animal

todas são heranças simples.

Herança múltipla seria se por exemplo:

public class b
public class c
public class a extends b, c

clodoaldoaleixo

Se você realmente precisa de uma situação dessas, use Interfaces, é claro que não é a mesma coisa de herança, mas você pode simular uma.

E

entendi

Obrigado pelo esclarecimento

herbertins

alias interfaces sao muito melhores que heranças.

G

Elas são mais versateis mesmo

P

Mas em alguns casos utilizar a Herança poupa muito trabalho e é muito útil.

Mas concordo que no geral as interfaces são bem mais versáteis.

juloko666

Quando vc cria uma herança define uma relação muito grande entre as classes.

Algumas vezes voce herda para reutilizar métodos ou sobrescreve-los, assim:

Class AlgumaCoisa
{
void fazAlgumaCoisa(... parametros)
{
...
}
}

Class OutraCoisa extends AlgumaCoisa
{
//AGORA QUANDO VC INSTANCIA UM OBJ DESTA CLASSE, CONSEGUE CHAMAR O METODO "fazAlgumaCoisa"
}

FAÇA ASSIM

Class OutraCoisa 
{
AlgumaCoisa objAlgumaCoisa=new AlgumaCoisa();
objAlgumaCoisa.fazAlgumaCoisa(...parametros);
}

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 :wink: 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

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 :wink: 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:

class PrivadaQueAnda: Privada,Veiculo {
}

Para fazer isto em Java, vc pode fazer alguma coisa do tipo:

class PrivadaQueAnda extends Privada implements Veiculo {
   private Veiculo v = new Veiculo();
   public void anda(){   // este é o método presente na interface de veículo
       v.anda();             // este é o método anda do Objeto veículo agregado a classe 
   }
}
E

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.

interface IVeiculo{
   public void anda();
}

class Veiculo implements IVeiculo{
   public void anda(){
      ... // a implementação
   }
}

 class PrivadaQueAnda extends Privada implements IVeiculo {
    private Veiculo v = new Veiculo();
    public void anda(){   // este é o método presente na interface de veículo
        v.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? :smiley:

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. :wink:

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 :wink: )

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?

Criado 31 de janeiro de 2007
Ultima resposta 1 de fev. de 2007
Respostas 32
Participantes 9