344 votes

Interface ou une classe abstraite : laquelle utiliser ?

Veuillez expliquer quand je devrais utiliser une interface PHP et quand je devrais utiliser une classe abstraite?

Comment puis-je transformer ma classe abstraite en une interface?

17voto

Mitch Wheat Points 169614

La principale différence est qu'une classe abstraite peut contenir une implémentation par défaut tandis qu'une interface ne le peut pas.

Une interface est un contrat de comportement sans aucune implémentation.

12voto

TopinFrassi Points 381

D'un point de vue philosophique :

  • Une classe abstraite représente une relation "est un". Disons que j'ai des fruits, eh bien j'aurais une classe abstraite Fruit qui partage des responsabilités et des comportements communs.

  • Une interface représente une relation "devrait faire". Une interface, à mon avis (qui est l'avis d'un développeur junior), devrait être nommée par une action, ou quelque chose de proche d'une action, (Désolé, je ne trouve pas le mot, je ne suis pas un anglophone natif) disons IEatable. Vous savez que ça peut être mangé, mais vous ne savez pas ce que vous mangez.

D'un point de vue codage :

  • Si vos objets ont du code dupliqué, cela indique qu'ils ont des comportements communs, ce qui signifie que vous pourriez avoir besoin d'une classe abstraite pour réutiliser le code, ce que vous ne pouvez pas faire avec une interface.

  • Une autre différence est qu'un objet peut implémenter autant d'interfaces que nécessaire, mais vous ne pouvez avoir qu'une seule classe abstraite en raison du "problème du losange" (consultez ici pour savoir pourquoi! http://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem)

J'ai probablement oublié certains points, mais j'espère que cela pourra clarifier les choses.

PS : Le "est un"/ "devrait faire" est introduit par la réponse de Vivek Vermani, je n'ai pas l'intention de lui voler sa réponse, juste de réutiliser les termes car je les ai aimés !

3 votes

Le mot que vous recherchez est comestible, je pense.

1 votes

En réalité, je crois que c'est un "verbe", un "mot d'action"

6voto

Vivek Vermani Points 1093

De la perspective du codage

Une interface peut remplacer une classe abstraite si la classe abstraite n'a que des méthodes abstraites. Sinon, changer la classe abstraite en interface signifie que vous perdrez la réutilisabilité du code que l'héritage fournit.

De la perspective du design

Gardez-le en tant que classe abstraite s'il s'agit d'une relation "Est un" et que vous avez besoin d'un sous-ensemble ou de la totalité des fonctionnalités. Gardez-le en tant qu'interface s'il s'agit d'une relation "Devrait faire".

Décidez de ce dont vous avez besoin : simplement l'application des règles, ou la réutilisabilité du code ET les règles.

Expliqué ici - http://www.buggybread.com/2013/07/java-importance-of-abstract-classes-and.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X