dúvida herança X composição

5 respostas
akumaldo

Alguém poderia me explicar herança X(versus) composição?
os prós e contras…ou melhor…explicar o que é uma composição…

aguardo… :slight_smile:

5 Respostas

Luiz_Henrique_Coura

composição, conhecido tb como TEM-UM, é uma associação mais forte. é qd uma parte não vive sem o todo.

vc consegue imaginar um corpo humano sem coração?

pense em herança como É-UM.

um pitbulll é um cachorro, q é um animal, mamífero, vertebrado…

akumaldo

Luiz Henrique Coura:
composição, conhecido tb como TEM-UM, é uma associação mais forte. é qd uma parte não vive sem o todo.

vc consegue imaginar um corpo humano sem coração?

pense em herança como É-UM.

um pitbulll é um cachorro, q é um animal, mamífero, vertebrado…

ótimo…entendi essa explicação sim!:smiley:

agora poderia me dar exemplo em java como isso acontece???(os prós de cada…os contras…exemplos…)

Mantu

Quer ver um exemplo prático?
Quando vc tem uma classe com essa cara …

public class Conta{
	private String cpf;
	private BigDecimal saldo;
	private Date abertura;

	/*Vários métodos aqui...*/
}

… dizemos que String compõe Conta, assim como BigDecimal e Date também compõe Conta. É bem o que nosso amigo te respondeu: Conta TEM-UM String, TEM-UM Date e TEM_UM BigDecimal.
.
Agora, vc já ouviu dizer que em Java, tudo é Object (salvo os tipos primitivos byte, short, char, int, long, float, double e boolean)? Dizem isso por que qualquer classe que é criada (ou existente) em Java É-UM Object. Isso quer dizer que há uma relação de herança entre Conta e Object, assim como entre String e Object, Date e Object, etc… A herança, como o LHC (desculpe a intimidade! :thumbup:)disse, faz com que vc possa tratar um pitbull como um mamífero, este como um animal, este como um ser vivo, e da mesma forma, vc pode tratar uma Conta como um Object, pois conta É-UM Object. Não acredita? faça o teste! Pegue uma instancia daquela sua classe Banco lá do outro post, e joga ela num syso, assim:

public static void main(String prams[]){ Banco b = new Banco(1524); System.out.println(b); }
Vai imprimir na tela alguma coisa tipo “seu.pacote.Banco@787d8f”
Perceba agora duas coisas:
1)O método println não tem nenhuma versão(sobrecarga) que receba como parâmetro uma instância da sua classe Banco, isso é óbvio.
2)O método println tem uma versão que recebe como parâmetro um Object e, internamente, ele joga na tela o retorno do método toString() desse Object.
Aí eu te pergunto: O que diabos aconteceu que, mesmo o println não tendo uma versão que receba sua classe Banco, ele imprimiu na tela aquela joça com o “@” no meio??? Simples, vc, sem perceber, usou a versão do println que recebe um Object, isto porque o seu Banco É-UM Object.
“Ah, mas o meu Banco naum tem nenhum método chamado toString()! Como então o println conseguiu dar um toString() no meu Banco???”
Simples:
Um mamífero mama, certo? Então um pittbull também mama!
Um Object pode “toStringar”(tem toString()), certo? Então um Banco também pode “toStringar”!
A coisa toda é mais ou menos assim, tem muito mais conceito aí por trás disso tudo, ok? Dá uma fuçada no GUJ por palavras como “instância”, “herança”, “referência”, “composição” que vc acha bastante coisa sobre o assunto.

Fabricio_Cozer_Marti

Mantu:
Quer ver um exemplo prático?
Quando vc tem uma classe com essa cara …

public class Conta{
	private String cpf;
	private BigDecimal saldo;
	private Date abertura;

	/*Vários métodos aqui...*/
}

… dizemos que String compõe Conta, assim como BigDecimal e Date também compõe Conta. É bem o que nosso amigo te respondeu: Conta TEM-UM String, TEM-UM Date e TEM_UM BigDecimal.


Na verdade é mais comum dizer que uma conta TEM, ou É COMPOSTA POR:
cpf, saldo, dataAbertura, e não dos tipos de dados :wink:

kuchma

Discussao, estrategias, pros e contras:

http://c2.com/cgi/wiki?CompositionInsteadOfInheritance
http://c2.com/cgi/wiki?UseCompositionAndInterfacesWithoutClassInheritance

Marcio Kuchma

Criado 21 de junho de 2006
Ultima resposta 21 de jun. de 2006
Respostas 5
Participantes 5