Pergunta

Uma interface é uma classe abstrata 100%, por isso podemos usar uma interface para programação eficiente. Existe alguma situação onde uma classe abstrata é melhor do que uma interface?

Foi útil?

Solução

Classes abstratas são usadas quando você pretende criar uma classe concreta, mas quer ter certeza de que há alguma Estado comum em todas as subclasses ou uma possível implementação comum para algumas operações.

Interfaces não podem conter qualquer um.

Outras dicas

Sim, há um lugar para ambas as classes abstratas e interfaces.

Vamos ir com um exemplo concreto. Nós vamos olhar para como fazer um CheckingAccount e SavingsAccount de um AbstractBankAccount abstrato e ver como podemos usar uma interface diferenciar os dois tipos de contas.

Para começar, aqui está um AbstractBankAccount classe abstrata:

abstract class AbstractBankAccount
{
    int balance;
    public abstract void deposit(int amount);
    public abstract void withdraw(int amount);
}

Temos o saldo da conta como balance e dois métodos deposit e withdraw que deve ser implementado pelas subclasses.

Como podemos ver, um classe abstrata declara a estrutura de como contas bancárias devem ser definidos. Como @Uri menciona em sua resposta, há um estado para esta classe abstrata, que é o campo balance. Isso não seria possível com uma interface.

Agora, vamos subclasse AbstractBankAccount para fazer um CheckingAccount

class CheckingAccount extends AbstractBankAccount
{
    public void deposit(int amount)
    {
        balance += amount;
    }

    public void withdraw(int amount)
    {
        balance -= amount;
    }
}

Neste CheckingAccount subclasse, implementamos as duas classes abstratas - nada de muito interessante aqui

.

Agora, como poderíamos implementar SavingsAccount? É diferente de um CheckingAccount na medida em que vai ganhar interesse. O interesse pode ser aumentado usando o método deposit, mas, novamente, não é como se o cliente está depositando o interesse ele / ela mesma. Portanto, ele pode ser mais clara se tivéssemos um outro meio de adição de dinheiro em uma conta, especificamente para o interesse, por exemplo, um método accrueInterest.

Podemos implementar diretamente o método em SavingsAccount, mas podemos ter mais tipos de contas bancárias que podem advir interesse no futuro, de modo que pode querer fazer uma interface InterestBearing que tem o método accrueInterest:

interface InterestBearing
{
    public void accrueInterest(int amount);
}

Assim, agora podemos fazer uma classe SavingsAccount que podem ganhar o interesse pela implementação da interface InterestBearing:

class SavingsAccount extends AbstractBankAccount implements InterestBearing
{
    public void deposit(int amount)
    {
        balance += amount;
    }

    public void withdraw(int amount)
    {
        balance -= amount;
    }

    public void accrueInterest(int amount)
    {
        balance += amount;
    }
}

Agora, se nós queremos fazer outro tipo de conta, digamos, um PremiumSavingsAccount, podemos fazer uma subclasse da AbstractBankAccount e implementar a interface InterestBearing para fazer outra conta remunerada.

A interface InterestBearing pode ser visto como adicionando uma característica comum para diferentes classes. Ele não teria ter feito sentido ter um recurso para lidar com interesse em uma conta corrente quando não acumular qualquer interesse.

Assim, há de fato lugares para ambas as classes abstratas e interfaces de coexistir e trabalhar juntos em uma situação.

Interface

classe Abstract v / s é um tema que gera muita curiosidade / interesse / confusão para alguém novo para Java e quer cavar mais fundo.

Este artigo fornece uma explicação detalhada sobre o tema.

Há um par de razões pelas quais você pode preferir uma classe abstrata livre de implementação através de uma interface:

  • Alguns moldes impossíveis e instanceof operações podem ser capturados em tempo de compilação.
  • Você tem a opção de adicionar métodos concretos em uma versão posterior.
  • Não costumava ser um benefício significativo desempenho há muitos anos.
  • A partir de uma perspectiva de segurança altamente obscuro, você não pode obter uma classe pré-existente para implementar os métodos criando uma subclasse da classe pré-existente e a classe abstrata.

Mas, por outro lado, a palavra-chave Java interface permite fonte mais limpa.

Em geral, as interfaces descrever a API pública que seu código deve usar, enquanto classes base abstratas são mantidos melhor como um detalhe de implementação, onde o código comum ou do estado pode ser mantido, para reduzir a duplicação de quaisquer classes de execução.

Ao usar as interfaces em sua API, torna-se mais fácil para as pessoas (incluindo você) para código de teste de escrita contra suas classes, desde que você pode usar classes de teste que, por exemplo, não dependem de quaisquer recursos externos, ou que exibem tipos explícitas de mau-mas-difícil de simular-em-vida real comportamento.

Assim java fornece a interface List, e a classe base abstrata AbstractList para "minimizar o esforço necessário para implementar" a interface ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top