Digamos que temos uma classe abstrata e deixemos que essa classe tenha apenas métodos abstratos. Essa classe abstrata é diferente de uma interface que possui apenas os mesmos métodos?
O que estou procurando saber é se existem diferenças filosoficamente, objetivamente e na implementação da linguagem de programação subjacente entre uma Classe Abstrata com apenas membros abstratos e uma Interface equivalente?
Respostas:
Tecnicamente, as diferenças não são realmente significativas, mas, conceitualmente, são coisas totalmente diferentes e isso leva às diferenças técnicas que outros mencionaram.
Uma superclasse abstrata é exatamente o que parece, é um tipo comum que é compartilhado por muitos outros tipos, como Gatos e Cães são Animais.
Uma interface também é exatamente o que parece, é uma interface através da qual outras classes podem se comunicar com o objeto. Se você deseja fazer uma Cat Walk, está bem, porque a Cat implementa uma interface CanWalk. O mesmo para um lagarto, embora eles andem de maneira muito diferente. Um Snake, por outro lado, não implementa o CanWalk, portanto você não pode dizer para Andar. Enquanto isso, Lizard e Snake (ou subclasses possivelmente mais explícitas - eu não sou especialista) podem perder a pele e, assim, implementar o CanShed, enquanto um gato não pode fazer isso.
Mas eles ainda são animais e têm propriedades comuns, como vivos ou mortos.
É por isso que todos os métodos em uma interface devem ser implementados como públicos (ou explicitamente, em C #). Porque qual é o ponto em uma interface que está oculta da classe que faz interface com o objeto? É também por isso que você pode ter várias interfaces para um objeto, mesmo quando um idioma não suporta herança múltipla.
Voltando à sua pergunta, quando você a vê dessa maneira, raramente há uma razão para ter uma superclasse inteiramente abstrata.
fonte
Na maioria das linguagens OOP, uma classe de implementação pode derivar apenas de uma classe abstrata, mas implementar várias interfaces.
fonte
Em uma linguagem como C ++ que permite herança múltipla e não possui interfaces, as classes abstratas nas quais todos os métodos são abstratos podem servir como interfaces. Não trabalhei muito com C ++, mas acho que a herança múltipla pode causar problemas quando existem métodos com o mesmo nome nas classes base.
Em linguagens como PHP e C #, as interfaces fornecem um meio de obter polimorfismos semelhantes, embora eu não goste de chamá-lo de "herança", pois há uma diferença conceitual entre herdar uma classe abstrata e implementar uma interface. As interfaces removem o problema do conflito, porque elas próprias não fornecem implementação.
Uma interface serve como um contrato para o mundo exterior, enquanto uma classe abstrata pode fornecer uma implementação, embora, se usada para "falsificar" uma interface, provavelmente não funcionará.
A principal diferença conceitual é que quando uma classe herda outra classe (abstrata ou não), existe uma relação de "é", então a
Car
é umVehicle
eDog
é umAnimal
. Com uma interface, é o que o objeto faz que importa. Assim, ambosCar
eDog
podeMove()
eo consumidor sabe disso porque implementarMovable
, mas um carro não é definitivamente umDog
, ou umAnimal
. E a implementação da mudança será diferente (rodas x pernas), mas o código de consumo não se importa e não deve se importar. As interfaces são todas sobre o código de consumo, e não a implementação.O ponto principal é que, se você tiver interfaces no idioma de sua escolha, use-as para coisas pelas quais elas estão lá. Caso contrário (como em C ++), você pode falsificá-las usando classes abstratas puras.
fonte
Dog
eCat
são .As classes abstratas podem apresentar métodos abstratos protegidos (nos idiomas com os quais estou trabalhando), nas interfaces os métodos geralmente são sempre públicos. Se essa diferença permite explorações úteis, não sei.
Editar Primeiro pensei que um método abstrato privado não seria útil, mas agora lembrei que ele pode ser usado para garantir que esse método nunca seja chamado. Dessa forma, você pode impedir que um construtor de cópias de um objeto seja chamado.
fonte
Sim, eles são diferentes. Caso contrário, os designers de idiomas não teriam fornecido os dois. Conheço duas linguagens que separam classes e interfaces: Java e C #, clone mutante de Java. Os designers criaram interfaces para evitar o suporte à herança de várias classes. A maioria dos outros idiomas suporta herança de várias classes e, consequentemente, não separa classes e interfaces.
fonte
Eu acho que a principal diferença é que: em uma classe abstrata - mesmo que todos os métodos sejam abstratos, eles ainda podem fornecer membros de dados (variáveis de instância) e algum código para as classes que o implementam (na forma de métodos ou construtores privados), blocos estáticos; fazendo parte do trabalho das subclasses e ajudando-as na implementação.
Um efeito colateral positivo: o código está em um lugar, portanto, em um lugar para fazer as correções. as subclasses podem simplesmente chamar o método de superclasse e, em seguida, fazer outra coisa ou nada se as ações de superclasse forem suficientes para o caso delas. A superclasse deseja que cada subclasse tome essa decisão, de modo que marcou toda a sua implementação como abstrata (algumas também podem estar vazias)
Não é relevante para a pergunta: mas ter interfaces significa que uma classe pode implementar dois contratos diferentes. Essa é uma vantagem de uma interface sobre uma super classe abstrata
fonte