- Quand doit-on
implement
ou doit -ilextend
être utilisé? - Quels sont des exemples concrets?
Est-ce correct?
La mise en œuvre semble être un moyen de faire en sorte que certaines méthodes existent dans une classe et que ces appels de fonctions de méthodes soient correctement formatés. L'implémentation n'est cependant pas un moyen de passer des variables ou des "paramètres" à la classe?
Scénario réel attendu: j'ai une plateforme de commerce électronique avec plusieurs classes de paiement qui suivent toutes le même design. Lorsqu'une nouvelle classe de paiement doit être ajoutée, il est vraiment facile de suivre la conception définie du interface
pour s'assurer que tous les éléments sont là, depuis le début.
L'extension des classes fait que la classe étendue (enfant?) Hérite de tout de sa classe parente à l'exception des méthodes et des variables déclarées comme private
?
Scénario réel attendu: j'ai une classe appelée sessions
avec deux classes enfants nommées sessioncookies
et databasesessions
. sessioncookies
et databasesessions
, ensemble, héritent d'un certain nombre d'options de configuration mutuelle de leurs sessions parentes, ce qui facilite la modification d'une option de configuration pour affecter toutes sortes de stockage éventuel des données des visiteurs.
Réponses:
L'héritage est utile pour réduire la quantité de code que vous réécrivez. Si vous avez plusieurs classes avec quelques méthodes ou champs communs, au lieu de définir ces méthodes et ces champs encore et encore, vous pouvez les factoriser dans une classe de base et faire en sorte que chacune des classes enfants étende cette classe de base.
Les interfaces (et
implements
) sont utiles lorsque vous souhaitez définir un protocole commun pour le comportement d'un groupe d'objets. Par exemple, vous souhaiterez peut-être exiger que les objets comparables puissent être comparés pour l'égalité et le hachage, etc.L'utilisation de l'héritage est finalement un choix de conception. Soyez à l'affût des cas où vous définissez les mêmes méthodes sur plusieurs classes; ce sont d'excellents cas où vous pouvez intégrer ces méthodes dans une classe de base. Il en va de même pour les classes qui observent certaines des mêmes caractéristiques: vous pouvez garantir la cohérence en mettant ces caractéristiques dans une interface à implémenter par ces classes associées.
L'héritage est un gros concept en POO qui va bien au-delà de PHP. Je vous recommande de lire l'article de wikipedia sur l'héritage et peut-être les Design Patterns by the Gang of Four .
Je crois que votre compréhension de l'héritage est principalement correcte. La prochaine étape serait de l'utiliser en production.
la source
Mettre en place:
Les interfaces sont des classes abstraites, vous ne pouvez donc déclarer que des choses. Une classe implémente une interface. Vous pouvez implémenter plusieurs interfaces.
Étendre:
Vous étendez les classes lorsque vous souhaitez une version plus spécifique d'une classe.
Exemple:
// Contract: a pet should play public interface Pet { public void play(); } // An animal eats and sleeps class Animal { public void eat(); public void sleep(); } public class Camel extends Animal { } public class Dog extends Animal implements Pet { public void play() {...} }
Le chameau et le chien sont tous deux des animaux, ils élargissent donc la
Animal
classe. Mais seul le chien est un type spécifique de ceAnimal
qui peut également être unPet
la source