Interface x Herança

Olá. Sou estudante de A.D.S. e estou fazendo uma pesquisa sobre Interfaces e Heranças.

Por quê, em java, os programadores privilegiam (ou devem privilegiar) o uso de interfaces em seus projetos ao invés do uso de Herança com classes? À quais características de Interface se devem essa preferência?

1 curtida

Eu costumo dizer que: herança é um tipo de relação que estreita as possibilidades e implementação (interface) é um tipo de relação que expande as possibilidades.
Ah, não é apenas no java que isso é (ou deveria ser) priorizado. Basicamente, é em tudo o que você implementa o paradiga da orientação a objetos. A peculiaridade de não possuir suporte à herança múltipla, talvez, ajude para que este mito mantenha-se no java.

Bom, a herança visa evitar que você tenha duas ou mais classes com duplicidade de atributos e/ou métodos. Está ligada ao conceito de generalização da OO, apenas. Eventualmente, você pode trabalhar com polimorfismo.
Já a interface visa, primeiro, estabelecer um contrato entre o que você implementou e uma terceira parte, que pode ou não ser desenvolvido por ti, pelo time no qual você trabalha ou pela empresa onde isso ocorre.
Esse contrato, a interface, possui a declaração de métodos, sem corpo (ok, do java 8 para frente você já tem coisas como o default method). Todos os atributos inseridos numa interface será, automaticamente, static final, ou seja, são constantes (podendo ser, apenas, default ou public).
O objetivo de implementar uma interface está ligado a dois conceitos da OO: o primeiro (e mais óbvio): polimorfismo. Uma vez que a classe concreta que implementa uma interface é obrigada a dar corpo a cada método presente neste contrato, é a ideia fundamental de existir desses caras.
O segundo caso está ligado a encapsulamento em nível de classe. Com o uso de uma interface, você só expõe o que realmente precisa ser exposto.

Em geral, prefira composição/agtregação e implementação a herança.

1 curtida

Estes conceitos são muito bem abordados no livro Use a cabeça - Padrões de Projeto(Head First - Design Paterns). A manutenção e reuso de componentes se faz via implementação(interface), enquanto a tentativa baseada em heranção tende a engessar o código.

Alguém discorda? Alguém pode acrescentar mais alguma coisa ao debate?

E em muitos casos não se deve usar nem um nem outro. Infelizmente vejo muito código usando por exemplo Interface sem necessidade, por consequencia uma codificação burocrática.

Vou te dar a chave dessa pergunta: Busque essa informações em livros de POO e no minimo 2 a 3 que ai você possa montar uma resposta com implementações e um conteúdo bem escrito.

Não vai adiantar pegar trechos de idéias, vai te confundir mais. E quem sabe você mesmo responda a sua pergunta aqui deixando um conteúdo bem elaborado.

1 curtida