Diferença entre interface e classe abstrata em Java e C #
Contente
A interface e a classe Abstract contribuem para o "tipo incompleto" no POO. Às vezes, precisamos de uma superclasse para definir "o que fazer", mas, não "como fazer", é como fazer parte será implementada pela classe derivada de acordo com sua necessidade ",interface”Fornecer uma solução para isso. Às vezes, precisamos de uma classe de superclasse que defina alguma estrutura generalizada que possa ser implementada por classes derivadas e alguma estrutura especificada que possa ser utilizada pelas classes derivadas, "classe abstrata”Fornece uma solução para isso. A diferença fundamental entre interface e classe abstrata é que a interface é totalmente incompleta e a classe abstrata é parcialmente incompleta.
- Gráfico de comparação
- Definição
- Principais diferenças
- Conclusão
Gráfico de comparação
Base para Comparação | Interface | Classe abstrata |
---|---|---|
Basic | Quando você conhece apenas os requisitos e não a implementação, você usa "Interface". | Quando você conhece parcialmente as implementações, usa "Classes abstratas". |
Métodos | A interface contém apenas métodos abstratos. | A classe Abstract contém métodos abstratos, bem como métodos concretos. |
Modificador de acesso de métodos | Os métodos de interface são sempre "Público" e "Abstrato", mesmo que não declaremos. Por isso, pode ser dito como 100%, pura classe abstrata. | Não é obrigatório que o método na classe abstrata seja público e abstrato. Também pode ter métodos concretos. |
Modificador restrito para métodos | Um método de interface não pode ser declarado com os seguintes modificadores: Público: Privado e Protegido Resumo: final, estático, sincronizado, nativo, strictfp. | Não há restrições nos modificadores da variável de classe abstrata. |
Modificador de acesso de variáveis | O modificador de acesso permitido para variáveis de interface é público, estático e final, independentemente de estarmos declarando ou não. | As variáveis na classe abstrata não precisam ser públicas, estáticas, finais. |
Modificadores restritos para variáveis | As variáveis de interface não podem ser declaradas como privadas, protegidas, transitórias, voláteis. | Não há restrição para os modificadores de variáveis de classe abstrata. |
Inicialização de variáveis | As variáveis de interface devem ser inicializadas no momento da sua declaração. | Não é obrigatório que variáveis de classe abstrata sejam inicializadas no momento de sua declaração. |
Instância e blocos estáticos | Na interface interna, você não pode declarar uma instância ou bloco estático. | A classe Abstract permite uma instância ou bloco estático dentro dela. |
Construtores | Você não pode declarar construtor dentro da interface. | Você pode declarar construtor dentro de uma classe abstrata. |
Definição de Interface
Java não permite herança múltipla. Ou seja, uma única classe não pode herdar mais de uma classe por vez. A razão por trás disso pode ser explicada com um exemplo. Vamos supor que tenhamos duas classes pai, A e B e uma classe derivada C. A classe derivada C herda as classes A e B.Agora, ambas as classes A e B têm o método set (), então será uma pergunta para a classe C qual método set () da classe deve herdar. A solução para esse problema é "interface".
Interface é uma classe abstrata pura. A palavra-chave usada para criar uma interface é "interface". Como todo o método dentro da interface é totalmente abstrato. A interface especifica apenas o que uma classe deve fazer, mas não define como faz. Só porque todo o método declarado dentro da interface é abstrato, nenhuma instância é criada para uma interface. A forma geral de "interface" em java é:access_specifier interface nome_da_ interface {tipo de retorno método-nome1 (lista de parâmetros); return-type method-name2 (lista de parâmetros); tipo final-varname1 = value; tipo final-varname2 = value; // ... return-type method-nameN (lista de parâmetros); tipo final-varnameN = value; }
O especificador de acesso é declarado público porque as classes precisam implementar a interface.
Não temos o conceito de "Interface" em C ++. Mas, Java e C # definem a interface muito bem.
Interface em Java:
- As variáveis de uma interface são por padrão sempre públicas, estáticas e finais.
- As variáveis devem ser inicializadas no momento da sua declaração.
- As variáveis nunca podem ser declaradas como privadas, protegidas, transitórias e voláteis.
- Os métodos de uma interface são sempre públicos e abstratos, ao passo que nunca podem ser declarados como privados, protegidos, finais, estáticos, sincronizados, nativos e strictfp.
- Você não pode declarar nenhum construtor dentro da interface, pois o principal objetivo do construtor é a inicialização das variáveis de classe, mas, na interface, as variáveis são inicializadas no momento de sua declaração.
- A interface pode herdar outras interfaces, mas a classe que implementa essa interface deve implementar os métodos de todas as interfaces herdadas.
- Uma classe pode herdar mais de uma interface por vez e deve implementar todos os métodos de todas as interfaces herdadas.
A forma geral de implementar uma interface em Java:
classe class_name implementa Interface_name {// class-body}
Para herdar uma interface, uma classe usa a palavra-chave "implementa", e a classe implementa todo o método declarado por uma interface herdada.
Interface em c #:
A interface em C # é quase semelhante à interface em Java, exceto:
- A interface em C # não declara variáveis.
- O nome da interface é prefixado com I maiúsculo e é herdado com um sinal de dois pontos (:).
A forma geral de implementar uma interface em C #:
classe class_name: interface_name {// corpo da classe}
Definição de Classe Abstrata
Uma classe que contém um ou mais métodos abstratos é chamada de classe abstrata, e uma classe é declarada como abstrata usando a palavra-chave "abstract", precedida pela palavra-chave "class" no início da declaração de classe. Como a classe abstrata contém o método abstrato, ela constitui um tipo incompleto. Portanto, você não pode criar objetos de uma classe abstrata. Sempre que uma classe herda uma classe abstrata, ela deve implementar todos os métodos abstratos da classe abstrata, caso contrário, também deve ser declarada como abstrata.O atributo abstract é herdado até que a implementação completa dos métodos abstratos seja alcançada.
A classe abstrata também pode conter métodos concretos que podem ser utilizados pela classe derivada como ela é. Mas você não pode declarar um construtor abstrato ou um método estático abstrato dentro de uma classe abstrata. A forma geral da classe abstrata em Java é a seguinte:
classe abstrata class_name {abstract method_name1 (); resumo method_name2 (); : return_type method_name3 (lista de parâmetros) {// método concreto} return_type method_name4 (lista de parâmetros) {// método concreto}};
O conceito de uma classe abstrata é semelhante em Java e C #. Uma classe abstrata é um pouco diferente em C ++.
Em C ++, se uma classe tiver pelo menos uma função virtual, a classe se tornará uma classe abstrata. Em vez da palavra-chave "resumo", a palavra-chave "virtual" é usada para declarar um método abstrato.
- Quando você tem o conhecimento de "o que é necessário", mas não de "como seria implementado", a interface deve ser usada. Por outro lado, se você sabe o que é necessário e sabe parcialmente como isso seria implementado, use uma classe abstrata.
- Uma interface possui todos os seus métodos abstratos, mas uma classe abstrata possui alguns métodos abstratos e outros concretos.
- Os métodos dentro de uma interface são públicos e abstratos, portanto, também é chamado como uma classe abstrata pura. Por outro lado, os métodos dentro de um resumo não se restringem apenas a ser públicos e abstratos.
- Um método de interface nunca pode ser privado, protegido, final, estático, sincronizado, nativo ou strictfp. Por outro lado, não há restrições aos métodos de uma classe abstrata.
- As variáveis em uma interface são públicas e finais, independentemente de as declararmos ou não, ao passo que não existe essa restrição para as variáveis de uma classe abstrata serem públicas e finais apenas.
- Variáveis em uma interface nunca podem ser protegidas por transientes ou voláteis, enquanto que não há restrição a variáveis em uma classe abstrata.
- A variável de uma interface deve ser inicializada durante a declaração. Por outro lado, as variáveis em uma classe abstrata podem ser inicializadas a qualquer momento.
- Dentro de uma interface, uma instância ou bloco estático não pode ser declarado, mas você pode declarar instância ou bloco estático dentro de uma classe abstrata.
- Você não pode definir construtor dentro de uma interface, enquanto que é possível definir construtor dentro de uma classe abstrata.
Conclusão:
Quando você precisa criar uma classe base que contém uma forma generalizada de métodos que podem ser implementados pelas classes derivadas de acordo com suas necessidades, o conceito de interface e classe abstrata ajuda a fazer isso.