Classes Abstratas x Interfaces (exemplos com C#)

Marcio Nizzola
4 min readMay 6, 2020

--

Muitas vezes alguns conceitos básicos como a diferença entre Classes Abstratas e Interfaces acabam sendo utilizados no nosso dia a dia, mas muitos desenvolvedores não recordam-se da teoria utilizada lá no começo dos seus estudos, ou utiliza sem conhecer toda a teoria, o intuito deste post é ajudar naquelas perguntas bastante teóricas que muitas vezes são feitas em processos de entrevistas de emprego, ou reforçar o conhecimento teórico para utilizar a estrutura mais correta.

Interfaces

Para começar, vamos falar de interfaces, o que são ?

Uma interface não é considerada uma classe, ela é uma “entidade”, ela não possui uma implementação, ela gera a assinatura para os métodos que uma classe deverá implementar, mas o que é essa assinatura ? é a definição que contém o nome do método, o tipo de retorno que ele dará e os parâmetros que recebe, veja abaixo um exemplo:

declaração de uma interface em C#

Pode-se notar que existe um método que retorna uma “List” de ingredientes (linha 3) e outro método que retorna um simples ingrediente (linha 5) baseado no parâmetro do tipo inteiro, chamado “ingredienteId”.

Então podemos também dizer que uma interface é um “contrato” que estabelece que uma classe que herde esta interface, será obrigada a implementar os métodos constantes na interface.

Uma Interface não possui um construtor, e seus métodos não são implementados, já que eles são “Abstratos” por definição (Um método abstrato é um método que não possui implementação na classe abstrata. Um método abstrato possui somente a definição de sua assinatura), também não possuem declarações do tipo “Public” ou “Private” pois todos eles já são automaticamente “Public”.

Não há como fazer instância de uma Interface.

As Interfaces são além de um molde para uma classe, uma forma de implementar uma herança múltipla, já que C# não permite.

A utilização de uma interface se dá através da sua menção na declaração de uma classe, que herda esta interface:

public class IngredienteRepository : IIngredienteRepository

O fato de herdá-la, obrigará que criemos todos os métodos definidos na Interface.

Após a criação de uma classe que seja baseada nesta interface, caso eu crie na interface um novo método, será obrigatório implementar o método em todas as classes derivadas.

Classe Abstrata

Uma classe abstrata tem o comportamento de uma super classe (classe pai), ela funciona apenas para ser herdada, não permite que se crie instâncias dela, ela faz com que as subclasses herdadas (filhas) a partir dela tenham a mesma hierarquia.

Ela pode conter métodos completos ou incompletos. Uma classe abstrata não suporta múltiplas heranças. Assim, uma classe pode implementar várias interfaces, mas apenas herdar de uma classe abstrata.

Uma classe abstrata normalmente possui métodos abstratos. Esses métodos são implementados nas suas classes derivadas concretas com o objetivo de definir o comportamento específico. O método abstrato define apenas a assinatura do método e, portanto, não contém código.

A classe filha será, então, forçada a definir tais métodos, pois, caso contrário, a classe filha também se tornará abstrata.

  • Métodos Abstratos — Os métodos abstratos estão presentes somente em classes abstratas, e são aqueles que não possuem implementação. A sintaxe deste tipo de método na classe abstrata (classe pai) é a seguinte:

ele só possui uma assinatura do método, ou seja, o formato que este deverá ter, quando usarmos a herança, a classe filha deverá implementá-lo conforme esta especificação, o simples fato de informar que a classe é filha da “BaseService” obriga implementá-lo.

Pronto, agora implementamos o método conforme a assinatura

Então pode-se concluir que o método abstrato é uma forma de obrigar a sua implementação.

Um método override fornece uma nova implementação de um membro herdado de uma classe base. O método que é substituído por uma declaração override é conhecido como o método base substituído.

Atualização: C# 8.0 permitirá criar métodos padrões dentro de interfaces, isto mesmo, agora, para que não precisemos ao criar um novo método implementá-lo em todas as classes que herdam aquela interface, foi permitido criar numa interface um “método padrão”, isto mesmo, são métodos que caso você não os instancie, não irão quebrar a sua aplicação na hora de compilar e também não irão disparar alertas para implementação!

No meu ponto de vista isto é um remendo que altera (ou fere) os conceitos de OOP, pois se você tivesse uma classe “PAI” com todos os métodos padrões isto não seria preciso, era só instanciar o método na classe “pai” ao invés de utilizar este artifício.

Abaixo mostro como é um exemplo de um método padrão no C# 8.0.

Exemplo de método padrão (disponível somente no C# 8.0)

Saiba mais sobre métodos padrão e a discussão que geraram.

Referências gerais:

--

--

Marcio Nizzola
Marcio Nizzola

Written by Marcio Nizzola

Microsoft MVP | Software Architect na CI&T | Prof. da Etec Itu | Membro Fundador da Comunidade Itu Developers.

No responses yet