Pergunta

Por que são classes abstratas ou interface criada, ou quando devemos usar classes abstratas ou de interface?

Foi útil?

Solução

Interface é usado quando você só quer declarar quais os métodos e os membros de uma classe deve ter. Qualquer um que implementa a interface terá de declarar e implementar os métodos listados pela interface.

Se você também quiser ter uma implementação padrão, use classe abstrata. Qualquer classe estender a classe abstrata terá de implementar apenas os seus métodos abstratos e membros, e terá algum implementação padrão dos outros métodos da classe abstrata, que você pode substituir ou não.

- EDIT - esqueci de mencionar, Earwicker me lembrou

Finalmente, você pode implementar tantas interfaces de como você quer, mas apenas estender uma classe (sendo que abstrata ou não). Tenha isso em mente antes de escolher.

Outras dicas

A principal diferença é que você pode implement múltiplas interfaces em uma classe, mas apenas extend uma única classe abstrata. Isso ocorre porque uma classe abstrata também pode definir os campos que armazenam dados, enquanto que uma interface não pode.

Uma classe abstrata é uma classe, que tem pelo menos um método abstrato ou você também pode fazer todos os seus métodos como abstrato. Obviamente, não pode ser instanciado. Você tem que herdar de uma classe abstrata e implementar os métodos abstratos na classe herdada (ou seja, a classe estender a classe abstrata).

Interfaces não são classes em tudo (por isso não chamá-los de interface da classe). Interfaces definir a assinatura de métodos sem qualquer implementação. Também as interfaces não têm estados-campos. Se você implementar uma interface em uma classe, você tem que fornecer implementações para todos os métodos fornecidos pela interface.

Não faz sentido definir uma API generalizada para algumas coisas, que podem ter completamente diferentes implementações. Classes abstratas são mais úteis para as classes que fazem principalmente o mesmo, mas tem algumas diferenças sutis. Você pode combinar as duas abordagens.

Um bom exemplo é o coleções quadro da classe biblioteca Java. Você tem a lista de interface, que define como listas têm de se comportar. Algumas implementações são, por exemplo ArrayList e LinkedList. Como eles se comportam semelhante, o material que funciona da mesma para ambos é implementado na classe abstrata AbstactList, ambos herdar isso.

Veja a interface é basicamente um "Contrato". Quando você está definindo uma interface que você está definindo um contrato. Onde classes abstratas são estendidos, as interfaces são implementadas.

Vamos considerar um exemplo.

public interface Friend {
void hello();
}

Agora que você definiu um contrato que diz que qualquer classe que quer implementar necessidades Friend para fornecer uma definição para hello() método.

Aqui é uma implementação:

public class myFriend implements Friend {
public void hello()
println("Done");
}

Agora myFriend cumpriu o contrato. Agora a pergunta é: Onde deve interfaces de ser usado

Interfaces ajudá-lo a definir um comportamento que deve ser implementado. Digamos que você tenha uma classe A que define algumas funcionalidades. Você quer que as outras classes para utilizar esta funcionalidade classe só se definir o comportamento particular (métodos). Você aplicar essa restrição em termos de interface.

SamuelCarrijo parece ter respondido a esta pergunta também.

Além de Java, algumas estruturas requerem uma interface para trabalhar com ele. Estou pensando em (digamos) dinâmica proxies , ou algum cliente / servidor proxy frameworks. Isso é porque eles usam a introspecção sobre o objeto para determinar métodos implementados pelas interfaces implementadas pelo objeto. Então, de vez em quando você tem que implementar uma interface para um objeto onde, talvez, você não iria normalmente incômodo.

Nota essa razão para interfaces é específica para Java.

As classes abstratas são usadas quando você está construindo uma hierarquia de herança. No entanto, a maioria das hierarquias de herança não deve ser muito "profunda" (ou seja, muitos níveis de herança). Muitos livros de design orientado a objetos vai favorecer as interfaces mais de herança (um livro que eu li uma vez citou um desenvolvedor como dizendo que "a herança é o single mais legal [orientada a objetos] característica que você não vai implementar"), pois isso permite que as classes a serem atribuídos comportamentos " por contrato", quando o contrato é a interface.

É interessante notar a resposta de samuelcarrijo - se você quiser ter uma implementação padrão de um método, você teria que usar uma classe abstrata que tem uma implementação concreta do método para dar uma implementação padrão. Esta implementação padrão pode ser substituído em classes filho.

Espero que isso ajude!

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