Classes Abstratas X Interfaces
Uma classe abstrata pode conter métodos completos ou incompletos. UmaInterface pode conter apenas a assinatura de um método, mas nenhum corpo ou implementação.
Portanto, em uma classe abstrata, pode-se implementar métodos, mas em umaInterface não.
Uma classe abstrata pode conter campos, construtores, ou destrutores e aplicar propriedades. Uma interface não pode conter campos, construtores, ou destrutores; pode possuir apenas a propriedade da assinatura, mas não a implementação.
Uma classe abstrata não suporta múltiplas heranças, mas uma interface pode suportar múltiplas heranças, assim uma classe pode herdar várias interfaces, mas apenas uma classe abstrata e uma classe que implementa uma interface tem de obrigatoriamente implementar todos os métodos da interface, mas o mesmo não é exigido no caso de uma classe abstrata, que são mais rápidas que as interfaces.
Então, quando devo utilizar o quê?
Classes Abstratas podem adicionar mais funcionalidades sem destruir as funcionalidades das classes filhos que poderiam estar usando uma versão mais antiga. Classes abstratas fornecem uma maneira simples e fácil para versionarnossos componentes e através da atualização da classe base, todas as classes que herdam são atualizadas automaticamente com a mudança.
Em uma interface a criação de funções adicionais terá um efeito sobre suas classes filhos, devido à necessidade de implementação dos Métodos criados nainterface. Então, classes abstratas deveriam ser usadas principalmente para objetos que estão estritamente relacionados, enquanto o uso de interfaces é mais adequado para fornecer funcionalidade comum a classes independentes.
Digamos que existem duas classes, de pássaros e de aviões, e nas duas existam os métodos chamados voar(). Seria estranho para uma classe avião herdar a classe pássaro apenas porque necessita do método voar(). Em vez disso, o método voar() deve ser definido em uma interface e em ambas as classes pássaro e avião devem implementar a interface. Se quisermos proporcionar uma funcionalidade em comum para os componentes, devemos utilizar uma classe abstrata.
Classes abstratas nos permitem implementar parcialmente uma classe, enquanto ainterface não contem a implementação de qualquer membro, por isso a seleção de interface ou classes abstratas depende das necessidades e design do nosso projeto.
Podemos fazer uma classe abstrata, interface, ou até uma combinação de ambas, dependendo de nossas necessidades.
Conclusão
Devemos utilizar classes abstratas quando queremos compartilhar funcionalidades em comum entre classes e utilizar interfaces quando desejamos que uma classe possua as mesmas assinaturas porém a implementação de cada método não precisa ser a mesma.
Comentários
Postar um comentário