Pourquoi auriez-vous besoin d'une interface, s'il existe déjà des classes abstraites?
Pour éviter l'héritage multiple (peut provoquer plusieurs problèmes connus).
Un de ces problèmes:
Le «problème des diamants» (parfois appelé «diamant mortel de la mort») est une ambiguïté qui survient lorsque deux classes B et C héritent de A et que la classe D hérite à la fois de B et de C. S'il existe une méthode dans A qui B et C ont remplacé, et D ne le remplace pas, alors quelle version de la méthode D hérite: celle de B, ou celle de C?
Source: https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem
Pourquoi / quand utiliser une interface?
Un exemple ... Toutes les voitures du monde ont la même interface (méthodes) ... AccelerationPedalIsOnTheRight()
, BrakePedalISOnTheLeft()
. Imaginez que chaque marque de voiture aurait ces "méthodes" différentes d'une autre marque. BMW aurait les freins sur le côté droit, et Honda aurait les freins sur le côté gauche de la roue. Les gens devraient apprendre comment ces "méthodes" fonctionnent à chaque fois qu'ils achètent une marque de voiture différente. C'est pourquoi c'est une bonne idée d'avoir la même interface dans plusieurs "endroits".
Que fait une interface pour vous (pourquoi quelqu'un en utiliserait-il une)? Une interface vous empêche de faire des "erreurs" (elle vous assure que toutes les classes qui implémentent une interface spécifique, auront toutes les méthodes qui sont dans l'interface).
// Methods inside this interface must be implemented in all classes which implement this interface.
interface IPersonService
{
public function Create($personObject);
}
class MySqlPerson implements IPersonService
{
public function Create($personObject)
{
// Create a new person in MySql database.
}
}
class MongoPerson implements IPersonService
{
public function Create($personObject)
{
// Mongo database creates a new person differently then MySQL does. But the code outside of this method doesn't care how a person will be added to the database, all it has to know is that the method Create() has 1 parameter (the person object).
}
}
De cette façon, la Create()
méthode sera toujours utilisée de la même manière. Peu importe si nous utilisons la MySqlPerson
classe ou leMongoPerson
classe. La façon dont nous utilisons une méthode reste la même (l'interface reste la même).
Par exemple, il sera utilisé comme ceci (partout dans notre code):
new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);
De cette façon, quelque chose comme ça ne peut pas arriver:
new MySqlPerson()->Create($personObject)
new MongoPerson()->Create($personsName, $personsAge);
Il est beaucoup plus facile de se souvenir d'une interface et d'utiliser la même partout, que de plusieurs différentes.
De cette façon, l'intérieur de la Create()
méthode peut être différent pour différentes classes, sans affecter le code "extérieur", qui appelle cette méthode. Tout ce que le code extérieur doit savoir, c'est que la méthode Create()
a 1 paramètre ( $personObject
), car c'est ainsi que le code extérieur utilisera / appellera la méthode. Le code extérieur ne se soucie pas de ce qui se passe à l'intérieur de la méthode; il suffit de savoir comment l'utiliser / l'appeler.
Vous pouvez également le faire sans interface, mais si vous utilisez une interface, c'est "plus sûr" (car cela vous empêche de faire des erreurs). L'interface vous assure que la méthode Create()
aura la même signature (mêmes types et même nombre de paramètres) dans toutes les classes qui implémentent l'interface. De cette façon, vous pouvez être sûr que TOUTE classe qui implémente l' IPersonService
interface aura la méthode Create()
(dans cet exemple) et n'aura besoin que de 1 paramètre ( $personObject
) pour être appelée / utilisée.
Une classe qui implémente une interface doit implémenter toutes les méthodes que l'interface possède / possède.
J'espère que je ne me suis pas trop répété.