Interface ou classe abstrata

Devo usar classe abstrata ou interface?

As funcionalidade de  uma classe abstrata e de uma interface são bastante similares.Entretanto,há alguns prós e contras.

Herança

Uma classe no C# pode herdar somente de uma classe pai.Portanto,quando herdar uma subclasse de uma classe abstrata,a classe derivada,gastou a sua habilidade de participar na hierarquia de classes.

Herança única

C# suporta somente herança única:C# não suporta,herança de multiplas classes assim como o c++;Mas,usando classes abstratas e interfaces,programadores de C# podem obter o mesmo resultado,sem a bagunça e os problemas de  manutenção de multiplas heranças.

Value Types Polimorfismo

Value types no .NET são objetos descendentes de System.Object;eles não podem herdar de outros tipos.Mas podem implementar interfaces.Por exemplo,tipos primitivos – como Int32 – podem implementar a interface Icomparable,tornando se assim,comparaveis.

Versionamento

Uma classe abstrata pode conter implementações de interfaces.Isso simplifica o versionamento.Uma classe abstrata pode ser extendida adicionando novos métodos não abstratos com implementações padrão.

Uma interface não pode ser modificada sem quebra de contrato com as classes que a implementam.Uma vez que a interface esteja em uso,seus membros são fixos permanentemente.Um API baseado em interfaces só pode ser extendido,através de novas interfaces.

Flexibilidade de design

Interfaces oferecem maior flexibilidade em design,precisamente,porque podem ser implementadas por qualquer classe independente de sua hierarquia.

Melhores práticas

Use interfaces e classes abstratas em conjunto para melhorar seu código.
Use classe abstrata:

  • Quando criar uma class library a qual pode ser amplamente destribuida ou reusada – especialmente para clientes.Porque classes abstratas simplificam o versionamento.
  • Pra definir uma classe base em comum entre tipos familiares.
  • Pra oferecer comportamento padrão.

Use Interface:

  • Criar um projeto individual,que possa ser mudado no futuro,use uma interface porque oferece mais flexiblidade.
  • Para introduzir comportamento polifórmico sem subclasses e pra um modelo de multiplas heranças.Permitindo que um tipo especifico possa suportar multiplos comportamentos.
  • Pra desenvolver uma hierarquia poliformica para value types.
  • A intenção for de um contrato imutavel.

Resumo

A tabela a seguir compara interfaces e classes abstratas:

Classe abstrata Interface
Classes abstratas gastam sua opção de herança. Classes podem implementar múltiplas interfaces sem gastar a opção de herança.Mas não há implementações padrão.
Não pode ser instanciada.Exceto como parte de uma subclasse.Somente classes derivadas podem chamar um construtor de uma classe abstrata. Não podem ser instanciadas.
Define assinaturas abstratas de membros que a classe derivada deve implementar.De outra forma,a classe derivada em si também seria abstrata. Define assinaturas abstratas de membros .Todas as classes que implementam a interface devem implementa-los.De outra forma,ocorre um erro de compilação.
Novos membros não abstratos podem ser adicionados,que as classes derivadas não perderão a compatibilidade de versão. Extender uma interface com novos membros,quebra a compatibilidade de versão.
Opcionalmente,oferecer implementação padrão de um membro Virtual. Todos os membros são virtuais e não podem oferecer implementações.
Pode incluir fields. Não pode incluir fields.Mas pode declarar propriedades abstratas.

Confira mais sobre Interface vs Classe abstrata
Até a próxima!

A tabela a seguir compara interfaces e classes abstratas:
Anúncios