Uma classe abstrata se parece muito com uma interface, mas o conceito é um pouco confuso para os iniciantes em OOP. Conceitualmente, uma classe abstrata se parece com uma interface, é claro, sem nenhuma implementação, mas elas têm seu quinhão de diferenças. Enquanto uma classe abstrata pode ser implementada parcial ou totalmente, uma interface deve ser implementada completamente. Bem, a diferença mais notável entre os dois é que uma classe abstrata pode ter implementação padrão, enquanto uma interface é apenas a definição de métodos que contém apenas as declarações dos membros. Vamos discutir os aspectos teóricos de ambos em detalhes.
Uma classe abstrata é um tipo especial de classe que atua como base de outras classes e não pode ser instanciada. A lógica de implementação de uma classe abstrata é fornecida por suas classes derivadas. Para tornar uma classe abstrata, o modificador "abstract" é usado, o que significa que algumas implementações ausentes precisam ser implementadas na classe derivada. Ele contém membros abstratos e não abstratos. Uma classe abstrata destina-se a fornecer funcionalidades básicas que podem ser compartilhadas e substituídas por várias classes derivadas. É útil evitar qualquer tipo de duplicação de código. Eles se parecem muito com interfaces, mas com funcionalidade adicional.
Uma interface, por outro lado, não é uma classe que contém apenas a assinatura da funcionalidade. É um padrão sem implementação. Conceitualmente falando, é apenas a definição de métodos que contém apenas a declaração de membros. É um shell vazio que não contém a implementação de seus membros. É como uma classe base abstrata que contém apenas membros abstratos, como métodos, eventos, indexadores, propriedades etc. Não pode ser instanciada diretamente e seus membros podem ser implementados por qualquer classe. Além disso, várias interfaces podem ser implementadas por uma classe, no entanto, uma classe só pode herdar uma única classe.
Classe abstrata | Interface |
Uma classe abstrata pode ter todos os modificadores de acesso para declaração de membro de funções, subs e propriedades. | Uma interface não pode ter modificadores de acesso para declaração de funções, subs, propriedades etc. Todos os membros são assumidos como implicitamente públicos. |
Uma classe pode usar no máximo apenas uma classe abstrata. | Uma classe pode herdar qualquer número de interfaces. |
Herança múltipla não é suportada na classe abstrata. | Uma interface pode suportar herança múltipla. |
Tecnicamente, é uma classe que pode ou não conter tanto a definição quanto sua implementação. | Uma interface só pode ter a assinatura da funcionalidade, então é basicamente um shell vazio. |
Uma classe abstrata pode conter membros. consts, métodos definidos e stubs de métodos. | Uma interface pode conter apenas métodos e consts. |
Ele define a identidade principal de uma classe e é usado para descrever objetos do mesmo tipo de dados. | É usado para descrever as habilidades periféricas de uma classe. |
Membros de uma classe abstrata não podem ser estáticos, a menos que seja um Membro Completo. | Membros de uma interface não podem ser estáticos. |
É ideal para implementações do mesmo tipo e comportamento comum. | É melhor usar interfaces se várias implementações compartilharem apenas assinaturas de métodos. |
Pode ter declaração de construtor. | Não pode ter declaração de construtor. |
Uma classe abstrata possui campos e restrições predefinidos. | Os campos não podem ser definidos nas interfaces. |
Pode ter métodos abstratos e não abstratos. | Só pode ter métodos abstratos. |
Qual é a diferença entre uma classe abstrata e uma interface? Essa é provavelmente uma das perguntas mais comuns feitas em qualquer entrevista técnica. É provável que você encontre uma infinidade de informações sobre classes e interfaces abstratas em qualquer tutorial em C #, no entanto, entender a diferença entre as duas é a parte mais difícil. Você pode consolidar todas as informações que encontrar e ainda não conseguir o suficiente. Bem, conceitualmente, ambos são os termos mais importantes em programação e são os mesmos, no entanto, diferem bastante em termos de funcionalidade. Enquanto uma classe abstrata é um tipo especial de classe que atua como base para outras classes, uma interface, por outro lado, é apenas um shell vazio com apenas declarações de membros.