Classes abstratas e interfaces
A Programação Orientada a Objetos nasceu da necessidade de organização dos códigos-fonte das aplicações. Muitas pessoas se assustam com a POO, acredito que é devido o nível de abstração, porém é a mesma linguagem mas com o código organizado, tudo depende de disciplina.
Provavelmente o que confunde a cabeça de muita gente, na hora de programar em POO, são as classes abstratas e as interfaces. O conceito delas é muito simples: organização, principalmente definir padrões.
Em uma classe abstrata você pode declarar atributos e métodos que serão usados em uma classe final ou um grupo de classes final, nunca é uma outra classe abstrata ou interface. Na pratica isso ajuda a não repetir código, e se precisar alterar algo não será preciso ir em cada classe modificando a mesma coisa. Aplicações tipo ADO utilizam desse recurso para padronizar a comunicação com bancos de dados diferentes.
A interface só virtualizará métodos, e obrigatoriamente terão que declará-los na classe em que for implementada. A função da interface não difere da classe abstrata, porém a interface tem uma estrutura mais limpa que pode deixar sua aplicação mais leve.
O uso de interfaces e classes abstratas não é mandatório, porém se você tem um grupo de desenvolvimento é interessante que se crie certas abstrações para que sua aplicação fique bem estruturada e modulada. A modularização da aplicação também ajuda no trabalho do grupo separando-o por área de especialidade.
Olá Victor,
Gostaria de fazer algumas observações sobre este post.
Quando você diz:
– “Em uma classe abstrata você pode declarar atributos e métodos que serão usados em uma classe final ou um grupo de classes final, nunca é uma outra classe abstrata”
Isso está errado, uma classe abstrata pode sim ser filha de outra classe abstrata, logo, herdará comportamento e atributos da classe pai.
Outros dois pontos gravíssimos:
– “A interface só virtualizará métodos,”
– “A função da interface não difere da classe abstrata, porém a interface tem uma estrutura mais limpa que pode deixar sua aplicação mais leve.”
A maior dificuldade para a aprendizagem correta da POO é exatamente conseguir distinguir a diferença entre uma classe abstrata e uma interface e, quem ler os trechos acima ficará ainda mais confuso e irá aprender errado.
Uma interface não “virtualiza” nada. A interface é o contrato da implementação, ou seja, se uma classe implementa uma interface ela obedece aquele contrato. A interface também não pode conter implementação, diferente de uma classe abstrata. Enfim, **a interface difere-se muito de uma classe abstrata.**
E não tem nada de estrutura mais ou menos limpa e nem ficar mais leve ou mais pesado.
Obrigado Javeaux pelas observações. Reconheço que esse artigo esta mal redigido, deveria ter guardado ele por mais tempo como rascunho e o aperfeiçoado.
Permita-me então esclarecer sobre alguns equivocos:
1) multi-herança de classes abstratas: “Em uma classe abstrata você pode declarar atributos e métodos que serão usados em uma classe final ou um grupo de classes final, nunca é uma outra classe abstrata” — afirmei isso com base no livro “PHP – Programando com Orientação a Objeto” do Pablo Dall’Oglio, que apesar de não afirmar a multi-herança induz o leitor, menos experiente, a acreditar que ela não existe.
2) interfaces: “A interface só virtualizará métodos, e obrigatoriamente terão que declará-los na classe em que for implementada” — Posso não ter me expressado bem nessa afirmação para alguns, mas não esta totalmente errada, em uma interface você declara os métodos, virtualiza, porém não os implementa, isso é feito na classe que implementar a interface.
Peço desculpa a todos e prometo escrever um artigo decente da proxima vez.