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
?
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
?
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 !
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 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.