Classes Abstratas vs Interfaces

No paradigma da orientação a objetos, há dois termos que são frequentemente confundidos: as classes abstratas e as interfaces. Apesar de serem utilizadas para propósitos diferentes, possuem aspectos similares, como veremos durante este artigo.

Classes Abstratas

É um tipo de classe especial que não pode ser instanciada, apenas herdada. Sendo assim, uma classe abstrata não pode ter um objeto criado a partir de sua instanciação. Essas classes são muito importantes quando não queremos criar um objeto a partir de uma classe “geral”, apenas de suas “subclasses”.

Imagine que possuímos três classes (Conta, Conta Corrente e Conta Poupança), sendo a classe Conta uma classe “geral” (comumente chamada de classe “pai”). Ao ir em um banco, nós não criamos uma nova Conta, mas sim uma Conta Corrente ou uma Conta Poupança.

Sendo assim, não faz sentido que a classe Conta possa ser instanciada, já que é um erro na regra de negócio caso isso ocorra. É aí que entra o termo “abstrato” desse tipo de classe, por não haver a necessidade de criar objetos com base em uma classe “pai”, não há porquê ela permitir a instanciação de novos objetos.

Agora, ao invés de criarmos um objeto do tipo Conta, só será permitido a criação de objetos do tipo Conta Corrente ou Conta Poupança, o que faz mais sentido.

Por não permitir a instanciação de novos objetos com base em uma classe abstrata, este tipo de classe é utilizada para implementar o conceito de Herança da OO. Ou seja, as classes abstratas irão armazenar atributos e métodos comuns às classes que a irão herdar, permitindo um maior reaproveitamento de código.

Além disso, as classes abstratas permitem que criemos métodos abstratos (mas nem todos). Basicamente, um método abstrato é um método especial que não possui implementação, apenas assinatura (tipo de retorno, nome e parâmetros), e obriga as classes que “herdarem” da classe abstrata à implementar estes métodos, algo muito parecido com o assunto do nosso próximo tópico, as interfaces.

Python - Orientação a objetos
Curso de Python - Orientação a objetos
CONHEÇA O CURSO

Interfaces

Considerada uma Entidade, as interfaces têm papel fundamental no desenvolvimento de software orientado à objetos. Por várias vezes, nós precisamos, de alguma forma, especificar um conjunto de métodos que um grupo de classes deverá, obrigatoriamente, implementar. Para atingir este efeito, utilizamos as interfaces.

Basicamente, uma interface define um “contrato” a ser seguido por outras classes. Este contrato é composto por cláusulas, que descrevem determinados comportamentos que este grupo de classes deverá seguir.

Imagine que você irá alugar um novo imóvel, para isso, você deve assinar o contrato de locação, que impõe regras que deverão ser seguidas, caso você queira assiná-lo. Estas regras são os métodos que as classes deverão implementar para que o contrato seja válido.

Por “obrigar” que as classes que implementem uma interface, também implementem seus métodos, as interfaces apenas definem as assinaturas dos métodos (tipo de retorno, nome e parâmetros). A partir daí, é obrigação da classe que quer implementar esta interface, utilize esta assinatura e implemente seus métodos. Estes métodos, assim como nas classes abstratas, devem ser abstratos.

Além disso, por não ser considerada uma classe, as interfaces não possuem construtores e, por isso, não podem ser instanciadas, como as classes abstratas.

Classes Abstratas vs Interfaces

Vimos então que as classes abstratas e interfaces possuem algumas características semelhantes (não podem ser instanciadas, possuem métodos abstratos que obrigam as outras classes a implementá-los), porém elas não servem para o mesmo propósito.

Quando utilizamos as interfaces, estamos definindo um conjunto de assinatura de métodos que outras classes devem implementar. Com isso, apenas definimos o comportamento base de um conjunto de classes que, por ventura, implementem esta interface.

Já as classes abstratas servem para prover uma base para que as classes que “herdem” desta não precisem se preocupar com o comportamento padrão, apenas com suas características e comportamentos pessoais.

Sendo assim, sempre que precisarmos definir um conjunto de métodos que devem ser implementados por um grupo de classes, utilizamos as interfaces. Se precisarmos determinar uma classe base para outras classes, que herdarão seus atributos e métodos e esta classe não deva ser instanciada, utilizamos as classes abstratas.

Deixe seu comentário

Professor na TreinaWeb e graduado em Sistemas de Informação pelo Instituto Federal da Bahia. Apaixonado por desenvolvimento web, desktop e mobile desde os 12 anos de idade. Já utilizou todos os sistemas operacionais possíveis, mas hoje se contenta com o OSX instalado em seu desktop. Quando não está trabalhando, é IGL e Awper do time de CS:GO da Treinaweb. Até passou em uma peneira do Cruzeiro, mas preferiu estudar Python.

© 2004 - 2019 TreinaWeb Tecnologia LTDA - CNPJ: 06.156.637/0001-58 Av. Paulista, 1765, Conj 71 e 72 - Bela Vista - São Paulo - SP - 01311-200