Quand mettre en œuvre et étendre? [fermé]

90
  • Quand doit-on implementou doit -il extendê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 interfacepour 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 sessionsavec deux classes enfants nommées sessioncookieset databasesessions. sessioncookieset 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.

Industriel
la source
1
Je vous recommande de lire sur l'héritage.
Rafe Kettler

Réponses:

64

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.

Rafe Kettler
la source
4
Beaucoup de gens considèrent maintenant le livre The Gang of Four comme trop lourd en termes de matériel comme introduction aux modèles de conception. Une alternative populaire est Head First: Design Patterns qui permet une lecture plus légère. amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan
1
"Soyez à l'affût des cas où vous définissez les mêmes méthodes dans plusieurs classes; ce sont d'excellents cas où vous pouvez factoriser ces méthodes dans une classe de base." L'extension d'une classe aurait-elle un avantage par rapport à l'utilisation d'un trait pour définir ces méthodes?
Daniel Weiner
1
"L'héritage est utile pour réduire la quantité de code que vous réécrivez" - Le but de l'héritage est de partager le comportement, pas le code. Lorsque cela est possible, les traits sont le moyen de partager du code plutôt que d'étendre une classe abstraite avec des classes concrètes qui autrement n'ont rien en commun. Vous pouvez généralement modéliser vos classes comme des relations has-a plutôt que is-a, ce qui facilitera davantage la réutilisabilité du code et le polymorphisme.
Duncan
12

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 Animalclasse. Mais seul le chien est un type spécifique de ce Animalqui peut également être unPet

Ahmad Mobaraki
la source