Classe Abstrata ou Interface  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
thegoergen
Virtual Machine Man
[Avatar]

Membro desde: 24/09/2007 09:44:03
Mensagens: 562
Localização: Estrela/RS
Offline

Qual a diferença entre elas??

Assim: Qual a diferença entre implementar uma interface, implementando todos os métodos , ou herdar de uma classe que tenha métodos abstratos, que terão que ser sobrescritos.??

"A preguiça de pensar é a maior burrice de uma pessoa." (Diego Inácio Goergen)


http://www.linuxdicas.com.br/perguntas.html -- Como fazer perguntas inteligentes
[MSN] [ICQ]
antoniopopete
Virtual Machine Man

Membro desde: 27/12/2006 02:37:31
Mensagens: 707
Localização: Salvador - BA
Offline

Diferença funcional nenhuma.
Mas em relação a projeto, existe uma diferença significativa.
Quando você fala que vai herdar de uma classe abstrata no seu projeto quer dizer que quem herda é um tipo da classe abstrata, só que especializada.
E o conceito de interfaces, você usa como um serviço que a classe possui.
Quem implementa a interface PersistenciaDAOIf tem que prover todos serviços dessa interface, sem necessariamente ser um PersistenciaDAO.
Mais ou menos assim.
Segue alguns links:

http://www.macoratti.net/net_ica1.htm

http://www.guj.com.br//jforum.java?sourceid=Mozilla-search&module=search&action=search&clean=1&search_keywords=classe+abstrata+x+interface&search_terms=all&sort_by=p.post_time&sort_dir=DESC

http://wickedcoolthoughts.blogspot.com/2008/01/again-abstract-class-vs-interface.html

http://www.mail-archive.com/java-list@soujava.org.br/msg13520.html

Antonio Lazaro

[Email]
javaman00
JavaGuru

Membro desde: 28/03/2006 09:11:00
Mensagens: 292
Offline

thegoergen wrote:Qual a diferença entre elas??

Assim: Qual a diferença entre implementar uma interface, implementando todos os métodos , ou herdar de uma classe que tenha métodos abstratos, que terão que ser sobrescritos.??


Acredito que sua dúvida seja a implementação. Interface apenas uma janela de comunicação entre objetos.

Classes abtratas podes implementar e passar pra frente


--
Struts2 Enjoy!
fpavao
JavaChild
[Avatar]

Membro desde: 11/05/2007 16:43:51
Mensagens: 146
Localização: Jundiaí - SP
Offline

Lembrando também que Interface vc pode implementar várias, porém classe abstrata só pode herdar de uma...

Fernando Pavão
Sun Certified Java Programmer - SCJP 5
Sun Certified Business Component Developer - SCBCD 5
Sun Certified Enterprise Architect (I) - SCEA 5 (Part 1)
SAP Certified Development Consultant - SAP NetWeaver
Microsoft Certified Professional - MCP
http://www.fernandopavao.com.br/
sergiotaborda
Forum Spammer
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 2045
Offline

thegoergen wrote:Qual a diferença entre elas??

Assim: Qual a diferença entre implementar uma interface, implementando todos os métodos , ou herdar de uma classe que tenha métodos abstratos, que terão que ser sobrescritos.??


Como já foi dito a diferença é no conceito e não na implementação.
Quanto vc usa uma classe abstracta a sua nova classe É-UM tipo da classe mãe.
Quando vc usa uma interface , a classe implementadora PARECE essa interface.

Existe uma grande diferença entre ser e parecer, como compreederá.

Heroi é um classe abstracta. Voador é um comportamento , logo é um interface.
O Heroi pode ser voador, mas nem todos os voadores são Herois (ex: passaro)

This message was edited 1 time. Last update was at 14/04/2008 14:51:43


Sérgio Taborda's Weblog
http://sergiotaborda.wordpress.com
-Introdução ao Scrum
-De júnior a sênior

O Novo Blog do MiddleHeaven :Coleções Aumentadas
[WWW]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 16366
Localização: SP
Offline

De modo geral, prefira usar interfaces a classes abstratas (pelo menos enquanto o Java não tiver "mixins" )
Eu normalmente faço o seguinte:
- Crio uma interface;
- Crio uma implementação padrão para essa interface;
- Para escrever uma classe que implementa essa interface, posso usar um membro privado que é uma instância dessa implementação-padrão, e delegar vários métodos dessa interface a essa implementação-padrão. Os métodos cuja implementação for diferente da padrão devem ser implementados explicitamente.

Classes abstratas deixam seu programa muito engessado. Às vezes isso é interessante (por exemplo, quando você cria uma servlet estendendo HttpServlet), mas normalmente isso é indesejável.
[WWW]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 3112
Localização: São Paulo
Offline

prefira sempre o uso de interfaces (e da para sempre usar interfaces em vez de classe abstrata, se voce gastar um pouquinho mais de codigo e fizer composicao). é mais elegante, mais flexivel e menos acoplado... justo porque nao ha heranca de codigo. algumas pessoas consideram heranca uma forte quebra de encapsulamento.

http://blog.caelum.com.br


Arquitetura e Design de Software: uma visão sobre a plataforma java
[Email] [WWW]
thegoergen
Virtual Machine Man
[Avatar]

Membro desde: 24/09/2007 09:44:03
Mensagens: 562
Localização: Estrela/RS
Offline

Entendi.

Valeu pessoal!

"A preguiça de pensar é a maior burrice de uma pessoa." (Diego Inácio Goergen)


http://www.linuxdicas.com.br/perguntas.html -- Como fazer perguntas inteligentes
[MSN] [ICQ]
victorwss
Forum Spammer
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2272
Localização: São Paulo - SP
Offline

Paulo Silveira wrote:prefira sempre o uso de interfaces (e da para sempre usar interfaces em vez de classe abstrata, se voce gastar um pouquinho mais de codigo e fizer composicao). é mais elegante, mais flexivel e menos acoplado... justo porque nao ha heranca de codigo. algumas pessoas consideram heranca uma forte quebra de encapsulamento.


Apesar de que há casos (tipo, aquelas interfaces com centenas de métodos), que é melhor herdar de uma classe abstrata.

Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Mestrando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68%
Próximos: SCJD (encalhado com o projeto), SCBCD (estudando), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).
[MSN]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 16366
Localização: SP
Offline

a) Se uma interface tem centenas de métodos há alguma coisa errada nela.
b) Que pena que Java não tem "mixins" igual Scala - aí não estaríamos discutindo essas coisas chatas.
[WWW]
victorwss
Forum Spammer
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2272
Localização: São Paulo - SP
Offline

thingol wrote:a) Se uma interface tem centenas de métodos há alguma coisa errada nela.
b) Que pena que Java não tem "mixins" igual Scala - aí não estaríamos discutindo essas coisas chatas.


Infelizmente existem algumas interfaces no java SE e no java EE que tem uma tonelada de métodos. HttpServletRequest é um bom exemplo. Já tentou fazer um façade para HttpServletRequest? Você vai ver que é bem mais conveniente herdar de HttpServletRequestWrapper.

Realmente, mixins é o que me faz mais falta no java e força você a escrever bastante código wrapper, apenas-passa-a-bola-para-frente ou nos piores casos copy-and-paste.

Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Mestrando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68%
Próximos: SCJD (encalhado com o projeto), SCBCD (estudando), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).
[MSN]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 3112
Localização: São Paulo
Offline

victorwss wrote:
Infelizmente existem algumas interfaces no java SE e no java EE que tem uma tonelada de métodos. HttpServletRequest é um bom exemplo. Já tentou fazer um façade para HttpServletRequest? Você vai ver que é bem mais conveniente herdar de HttpServletRequestWrapper.


Essa classe foi criada por uma questao dos frameworks poderem rodar em especificações mais novas, ja que a interface HttpServerRequest muda muito e metodos sao adicionados. Nao foi criada com o intuito de te poupar trabalho nao, nem de ser usada pelos servidores. É que se voce nao estende-la, o dia que entrar um novo metodo na HttpServletRequest, voce vai ter um NoSuchMethodError ao chama-lo na sua facade/proxy.

Intefaces com muitos metodos, como disse o thingol, é sinal de design ruim. Mesmo ocorre com Connection e alguns listeners.

Entendo seu argumento. Esse uso de interfaces que voce esta falando é só para nao ter de escrever algumas duzias de metodos, mas voce poderia facilmente usar composicao em vez de heranca: implementa a interface e delega para a classe, em vez de estende-la. Claro, voce tera de escrever um pouco mais, como ja falei no post anterior, mas qualquer ferramenta gera os delegate methods pra voce. Confesso que as vezes herdo tambem, mas com a plena consciencia de que seria mais elegante fazer como falei aqui

http://blog.caelum.com.br


Arquitetura e Design de Software: uma visão sobre a plataforma java
[Email] [WWW]
sergiotaborda
Forum Spammer
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 2045
Offline

Paulo Silveira wrote:
Intefaces com muitos metodos, como disse o thingol, é sinal de design ruim. Mesmo ocorre com Connection e alguns listeners.


Vamos com calma. Muitos métodos numa interface não é sinal de design ruim per se.
Connection tem muitos métodos, mas Connection faz parte de uma implementação do padrão Bridge. É suposto ela ter quantos métodos quiser.

Tudo depende do contexto.

Sérgio Taborda's Weblog
http://sergiotaborda.wordpress.com
-Introdução ao Scrum
-De júnior a sênior

O Novo Blog do MiddleHeaven :Coleções Aumentadas
[WWW]
Zakim
JavaEvangelist
[Avatar]

Membro desde: 21/07/2005 09:25:24
Mensagens: 480
Localização: Cuiabá - MT
Offline

Acredito que o objetivo da herança é de amarrar a classe a uma familia de objetos! Criando objetos de verdade e seguindo principios OO. Isso mantem a integridade de toda uma familia de objetos, embora os mantenham um tanto dependentes.....

A composição em relação a herança é válida, mas será que vale pra tudo mesmo?

Poderiam citar algum caso em que a herança valha a pena em relação a composição?



http://zakim.blogspot.com - Zakim
Sun Certified Java Programmer

Comece pequeno, pense grande e cresça rápido!
[Email] [MSN]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 3112
Localização: São Paulo
Offline

sergiotaborda wrote:

Vamos com calma. Muitos métodos numa interface não é sinal de design ruim per se.
Connection tem muitos métodos, mas Connection faz parte de uma implementação do padrão Bridge. É suposto ela ter quantos métodos quiser.


Corretissimo, generalizei demais, mudo a frase para "Interfaces com muitos metodos _geralmente_ indicam um design ruim" (e de qualquer maneira acho a interface Connection muito grande, poderia ter sido quebrada em varias!).

Zakim wrote:
A composição em relação a herança é válida, mas será que vale pra tudo mesmo?

Poderiam citar algum caso em que a herança valha a pena em relação a composição?


Pra ser sincero, nao vejo nenhum caso. Hoje sou bem xiita que nem o James Gosling, Erich Gamma e Joshua Bloch, que descem a lenha em cima de heranca!

James Gosling wrote:::Rather than subclassing, just use pure interfaces.
It's not so much that class inheritance is particularly bad. It just
has problems.::
.

http://www.artima.com/intv/gosling3P.html

No blog da Caelum há tambem um post sobre o assunto:
http://blog.caelum.com.br/2006/10/14/como-nao-aprender-orientacao-a-objetos-heranca/

This message was edited 1 time. Last update was at 15/04/2008 16:29:40


http://blog.caelum.com.br


Arquitetura e Design de Software: uma visão sobre a plataforma java
[Email] [WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team