Qual é exatamente a diferença entre uma interface e uma classe abstrata?
Uma interface é um contrato: A pessoa que escreve a interface diz: "Aceito coisas com esse aspecto", e a pessoa que usa a interface diz: "OK, a classe que escrevo tem esse aspecto".
Uma interface é uma concha vazia. Existem apenas as assinaturas dos métodos, o que implica que os métodos não têm um corpo. A interface não pode fazer nada. É apenas um padrão.
Por exemplo (pseudo-código):
// I say all motor vehicles should look like this:
interface MotorVehicle
{
void run();
int getFuel();
}
// My team mate complies and writes vehicle looking that way
class Car implements MotorVehicle
{
int fuel;
void run()
{
print("Wrroooooooom");
}
int getFuel()
{
return this.fuel;
}
}
Implementar uma interface consome muito pouco CPU, porque não é uma classe, apenas um monte de nomes, e por isso não há nenhum tipo de consulta cara para fazer. É ótimo quando é importante, como em dispositivos embutidos.
Classes abstratas, ao contrário das interfaces, são classes. Elas são mais caras de se usar, porque há um look-up para se fazer quando se herda delas.
As aulas abstractas parecem-se muito com interfaces, mas têm algo mais: Você pode definir um comportamento para eles. É mais sobre uma pessoa dizendo: "estas classes devem ser parecidas, e elas têm isso em comum, então preencha os espaços em branco!".
Por exemplo:
// I say all motor vehicles should look like this:
abstract class MotorVehicle
{
int fuel;
// They ALL have fuel, so lets implement this for everybody.
int getFuel()
{
return this.fuel;
}
// That can be very different, force them to provide their
// own implementation.
abstract void run();
}
// My teammate complies and writes vehicle looking that way
class Car extends MotorVehicle
{
void run()
{
print("Wrroooooooom");
}
}
Enquanto classes abstratas e interfaces são supostamente conceitos diferentes, as implementações tornam essa afirmação às vezes falsa. Às vezes, elas nem sequer são o que você pensa que são.
Em Java, esta regra é fortemente aplicada, enquanto em PHP, as interfaces são classes abstratas sem nenhum método declarado.
Em Python, as classes abstratas são mais um truque de programação que você pode obter do módulo ABC e está realmente usando metaclasses, e portanto classes. E as interfaces estão mais relacionadas à digitação de patos nesta linguagem e é uma mistura entre convenções e métodos especiais que chamam descritores (os métodos _method_).
Como é habitual na programação, há teoria, prática e prática em outra linguagem :-)
Uma explicação pode ser encontrada aqui: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm
Uma classe abstrata é uma classe que é implementado apenas parcialmente pela programador. Pode conter um ou mais métodos abstratos. Um método abstrato é simplesmente uma definição de função que serve para dizer ao programador que o método deve ser implementado em uma criança classe.
Uma interface é semelhante a um resumo classe; de facto, as interfaces ocupam a o mesmo espaço de nomes das classes e abstrato classes. Por esse motivo, você não pode definir uma interface com o mesmo nome como uma aula. Uma interface é uma classe abstrata; nenhum dos seus métodos são implementadas e, em vez de uma classe subclassificação dela, diz-se implementar essa interface.
De qualquer forma, acho esta explicação das interfaces algo confusa. Uma definição mais comum é: Uma interface define um contrato que as classes de implementação devem cumprir. Uma definição de interface consiste em assinaturas de membros públicos, sem qualquer código de implementação.
Não é realmente a resposta à pergunta original, mas uma vez que você tenha a resposta para a diferença entre eles, você entrará no dilema "quando usar cada um": https://stackoverflow.com/questions/1231985/when-to-use-interfaces-or-abstract-classes-when-to-use-both][1]*[2][3]*
Eu tenho conhecimento limitado de OOP, mas ver interfaces como um equivalente de um adjetivo em gramática tem funcionado para mim até agora (me corrija se este método é falso!). Por exemplo, nomes de interfaces são como atributos ou capacidades que você pode dar a uma classe, e uma classe pode ter muitos deles: ISerializável, ICountable, IList, ICacheable, IHappy, ...