Qual a diferença entre interface e classeAbstrata ?
“diferença arquitetural”
Qual a diferença entre interface e classeAbstrata ?
“diferença arquitetural”
As duas não possuem corpo, por outro lado, a interface seria como um “contrato”.
A classe abstrata é usada com extends, e a interface com “implements”, onde você pode implementar várias classes, ao passo que só pode extender uma.
Na prática é isso.
IMO, interface é uma maneira (gambiosa?) que a Sun encontrou para que o Java tivesse algo próximo a herança múltipla.
1 - esse tópico deveria estar em Java Básico
2 - Classe abstrata é uma classe como qualquer outra, a única diferença é que ela não pode ser instanciada. No mais, é tudo igual, pode ter métodos e atributos como qualquer visibilidade, além de métodos abstratos. Interfaces são como classes abstratas , mas com algumas restrições: podem ter apenas métodos públicos, abstratos e de instância ou constantes públicas.
3 - Não tem nada de gambiarra com interfaces. Na minha opinião , é uma maneira muito mais elegante de se promover polimorfismo do que com herança múltipla no estilo de C++. De fato, é o que interessa na herança múltipla - um mesmo objeto ser referenciado/acessado de diversas maneiras diferentes. Pra isso, é preciso apenas herança de interface. Por outro lado, herança múltipla de implementação, além de não ter muita utilidade prática (até hoje não vi nenhuma) só traz problemas, como o famoso diamante da morte, quando B e C herdam de A e D herda de B e C.
Respondendo à pergunta, interfaces são contratos de ‘serviços’ que uma classe deve oferecer, já classe abstrata é um classe que não pode ser instanciada e que pode definir alguns serviços abstratos que ela não sabe ainda como escrever e implementar completamente outros, como uma classe qualquer.
Concordo com o @rmendes08, não acho que Interfaces sejam gambiarra, acho que são mais elegantes que herança múltipla.
Uma alternativa também muito elegante são os traits de Scala
É uma controvérsia… mas já acho que essa pergunta deveria estar no Java Avançado… heheheh
[quote=rmendes08]1 - esse tópico deveria estar em Java Básico
2 - Classe abstrata é uma classe como qualquer outra, a única diferença é que ela não pode ser instanciada. No mais, é tudo igual, pode ter métodos e atributos como qualquer visibilidade, além de métodos abstratos. Interfaces são como classes abstratas , mas com algumas restrições: podem ter apenas métodos públicos, abstratos e de instância ou constantes públicas.
3 - Não tem nada de gambiarra com interfaces. Na minha opinião , é uma maneira muito mais elegante de se promover polimorfismo do que com herança múltipla no estilo de C++. De fato, é o que interessa na herança múltipla - um mesmo objeto ser referenciado/acessado de diversas maneiras diferentes. Pra isso, é preciso apenas herança de interface. Por outro lado, herança múltipla de implementação, além de não ter muita utilidade prática (até hoje não vi nenhuma) só traz problemas, como o famoso diamante da morte, quando B e C herdam de A e D herda de B e C.[/quote]
Existem várias forams de evitar o diamante da morte, e cada linguagem implementa a seu modo[1]. As interfaces de java não são tão especiais assim.
Interfaces podem não ser gambiarras, mas dizer que é mais elegante que herança multipla é um certo exagero.
Como se representa o classico exemplo de um veiculo anfibio em java? Preciso de um veiculo que implementa caracteristicas de veiculo terrestre e veiculo aquatico. Meu veiculo terrestre implementa uma interface que representa as caracteristicas de um veiculo terrestre e o meu veiculo aquatico implementa outra pra veoculo aquatico.
Legal, mas na pratica o veiculo anfibio é somente um veiculo que deve herdar caracteristicas de veiculo aquatico e terrestre. Simples assim. O que pode ser mais elegante que isso?
[quote=immortalSoul][quote=rmendes08]1 - esse tópico deveria estar em Java Básico
2 - Classe abstrata é uma classe como qualquer outra, a única diferença é que ela não pode ser instanciada. No mais, é tudo igual, pode ter métodos e atributos como qualquer visibilidade, além de métodos abstratos. Interfaces são como classes abstratas , mas com algumas restrições: podem ter apenas métodos públicos, abstratos e de instância ou constantes públicas.
3 - Não tem nada de gambiarra com interfaces. Na minha opinião , é uma maneira muito mais elegante de se promover polimorfismo do que com herança múltipla no estilo de C++. De fato, é o que interessa na herança múltipla - um mesmo objeto ser referenciado/acessado de diversas maneiras diferentes. Pra isso, é preciso apenas herança de interface. Por outro lado, herança múltipla de implementação, além de não ter muita utilidade prática (até hoje não vi nenhuma) só traz problemas, como o famoso diamante da morte, quando B e C herdam de A e D herda de B e C.[/quote]
Existem várias forams de evitar o diamante da morte, e cada linguagem implementa a seu modo[1]. As interfaces de java não são tão especiais assim.
Interfaces podem não ser gambiarras, mas dizer que é mais elegante que herança multipla é um certo exagero.
Como se representa o classico exemplo de um veiculo anfibio em java? Preciso de um veiculo que implementa caracteristicas de veiculo terrestre e veiculo aquatico. Meu veiculo terrestre implementa uma interface que representa as caracteristicas de um veiculo terrestre e o meu veiculo aquatico implementa outra pra veoculo aquatico.
Legal, mas na pratica o veiculo anfibio é somente um veiculo que deve herdar caracteristicas de veiculo aquatico e terrestre. Simples assim. O que pode ser mais elegante que isso?
[1]http://en.wikipedia.org/wiki/Diamond_problem
[/quote]
Ora, o padrão Decorator. Eu posso ter um VeiculoAbstrato e envolvê-lo com VeiculoTerrestreDecorator e VeiculoAquaticoDecorator, e temos ai nosso veiculo anfíbio. Assim como eu posso decorar um VeiculoAbstrato com VeiculoAereoDecorator e VeiculoAquaticoDecorator e temos ai um hidro-avião.
Falei que era Java Avançado… hehehehh
Em uma interface, todos os métodos por padrão são públicos e abstratos. Já em uma classe abstrata, pode haver métodos concretos e abstratos.
Meus dois centavos:
nunca entendi o motivo do pessoal prestigiar interface à herança a não ser na ausência de herança múltipla. Pra mim, a utilidade das duas é bastante distintas: se houver necessidade de um método E IMPLEMENTAÇÃO comum, uso herança. Se houver apenas métodos de comportamento comum, uso interface como contrato.
E nunca achei herança múltipla a cara da capeta, nem sempre você vai se deparar com uma situação que possa cair no diamante da morte, na maioria das vezes você reduziria muito a codificação e simplificaria seu software.
Por fim, não foi “a Sun que encontrou” a solução de interface, várias linguagens antes dela já usavam a mesma forma pra contornar a ausência de herança múltipla. Até o Delphi.
[quote=wellington.nogueira][quote=marcosalex]Por fim, não foi “a Sun que encontrou” a solução de interface, várias linguagens antes dela já usavam a mesma forma pra contornar a ausência de herança múltipla. Até o Delphi.[/quote]E mesmo linguagens que possuem herança múltipla fornecem interface.
interface é, meramente um contrato que deve ser seguido pela classe “implementadora”.
Classe abstrata é uma classe que possui comportamentos e pode necessitar fornecer um contrato que deve ser seguido pela “classe-filha”.
Entende-se por contrato, comportamentos que devam ser implementados.
Ambas tem por característica não serem capazes de serem instanciadas.[/quote]
Não conheço linguagem com herança multipla que utilize também interface. ( mas não dúvido que exista)
Independente disso, é bom dizer para o autor do tópico que a utilização de interfaces não é a única solução para situações onde uma classe precisa implementar um método (E a definição/implementação de uma também não garante que a classe de fato implementou o método proposto). No caso do java ela é somente uma forma de avisar o compilador que o objeto que está sendo definido pode ser utilizado para chamar um determinado método pois ‘provavelmente’ o objeto implementou aquele metodo.
Por exemplo, se voce quer que um objeto pule ( definição de uma caracteristica para objeto), então voce cria uma interface Saltitante onde ‘obriga’ a quem implementar aquela interface a implementar o método pular - definido na interface. ( Na verdade não é obrigado a implementar nada somente precisa colocar a assinatura do método e pronto). Assim, se uma outra classe precisa chamar o metodo pular, ele pode receber tudo que é ‘Saltitante’ e utilizar ela para chamar o método pular.
Em linguagens com caracteristicas difenretes do java existem outras formas de contornar o problema sem a necessidade de interfaces (e de forma mais simples). Nesses casos, temos um método que recebe qualquer objeto, independente do que ele seja. Basta este objeto implementar um método chamado pular que ele irá pular.
No primeiro, se existissem duas interfaces semelhantes, uma chamada Slatitante e outra Pulador, sendo que as duas implementassem o método pular, não poderia substituir uma pela outra. o método pular de Saltitante e pular de Pulador seriam ‘diferentes’ para o compilador, mesmo sendo a mesma coisa na prática. No momento de chamar o método eu teria que ser explícito sobre que tipo de objeto eu vou receber por parametro ( se é um pulador ou um saltador). No segundo caso, não interessa que tipo de objeto eu to passando desde que ele implemente o método pular - qualquer coisa que saiba pular, pode pular.
[quote=marcosalex]Por fim, não foi “a Sun que encontrou” a solução de interface, várias linguagens antes dela já usavam a mesma forma pra contornar a ausência de herança múltipla. Até o Delphi.[/quote]E mesmo linguagens que possuem herança múltipla fornecem interface.
interface é, meramente um contrato que deve ser seguido pela classe “implementadora”.
Classe abstrata é uma classe que possui comportamentos e pode necessitar fornecer um contrato que deve ser seguido pela “classe-filha”.
Entende-se por contrato, comportamentos que devam ser implementados.
Ambas tem por característica não serem capazes de serem instanciadas.