99 votes

Quand mettre en œuvre et étendre ?

  • Quand faut-il implement o extend être utilisé ?
  • Quels sont les exemples concrets ?

Est-ce correct ?

Mise en œuvre de semble être un moyen d'imposer l'existence de certaines méthodes dans une classe, et que les appels de fonction de ces méthodes soient correctement formatés. L'implémentation est pas un moyen de passer des variables ou des "paramètres" à la classe ?

Scénario attendu dans la vie réelle : J'ai une plateforme de commerce électronique comportant plusieurs classes de paiement qui suivent toutes le même modèle. Lorsqu'une nouvelle classe de paiement doit être ajoutée, il est très facile de suivre le design défini de la classe de paiement. interface pour s'assurer que toutes les pièces sont là, dès le début.

Extension du site fait en sorte que la classe étendue (enfant ?) hérite de tout de sa classe mère, à l'exception des méthodes et des variables déclarées en tant que private ?

Scénario attendu dans la vie réelle : J'ai une classe appelée sessions avec deux classes enfant nommées sessioncookies y databasesessions . sessioncookies y databasesessions Les sessions d'un même groupe héritent ensemble d'un certain nombre d'options de configuration mutuelles de leurs sessions parentes, ce qui facilite la modification d'une option de configuration pour affecter toutes sortes de stockage éventuel de données sur les visiteurs.

1 votes

Je vous recommande de vous documenter sur l'héritage.

71voto

Rafe Kettler Points 29389

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 champs encore et encore, vous pouvez les intégrer dans une classe de base et faire en sorte que chaque classe enfant étende cette classe de base.

Interfaces (et implements ) sont utiles lorsque vous souhaitez définir une valeur commune pour l'ensemble de l'UE. protocole pour savoir comment un groupe d'objets doit se comporter. Par exemple, vous pouvez exiger que les objets qui sont comparables puissent être comparés pour vérifier leur égalité et être hachés, etc.

L'utilisation de l'héritage est en définitive un choix de conception. Soyez attentif aux 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. Il en va de même pour les classes qui observent certaines des mêmes caractéristiques : vous pouvez garantir la cohérence en plaçant ces caractéristiques dans une interface à mettre en œuvre par ces classes apparentées.

L'héritage est un concept important de la 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 modèles de conception par le Gang of Four .

Je crois que votre compréhension de l'héritage est en grande partie correcte. L'étape suivante serait de l'utiliser en production.

4 votes

De nombreuses personnes considèrent aujourd'hui que le livre The Gang of Four est trop lourd en termes de contenu pour servir d'introduction aux modèles de conception. Une alternative populaire est Head First : Design Patterns, qui offre une lecture plus légère. amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124

1 votes

"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 ?

2 votes

"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 le code plutôt que d'étendre une classe abstraite avec des classes concrètes qui n'ont autrement rien en commun. Vous pouvez généralement modéliser vos classes en tant que relations has-a plutôt que is-a, ce qui facilitera davantage la réutilisation du code et le polymorphisme.

30voto

Ahmad Mobaraki Points 1178

Mettre en œuvre : Les interfaces sont des classes abstraites sans détails d'implémentation, donc vous pouvez seulement déclarer des choses( Contrats ). Une classe implémente une interface pour s'assurer qu'elle respecte les règles et les contrats de l'interface. Une classe peut implémenter multiple interfaces.

Prolonger : Vous étendre lorsque vous voulez un version plus spécifique d'une classe. Et aussi vous ne voulez pas répéter l'écriture d'autres méthodes qui existent dans la classe parente.

Exemple :

// Contract: a pet should play
public interface Pet {
    public void play(); 
}

// An animal eats and sleeps
class Animal {
    public void eat(){ //details };
    public void sleep(){ //details };
}

public class Camel extends Animal {
    // no need to implement eat() and sleep() but
    // either of them can be implemented if needed. i.e. 
    // if Camel eats or sleeps diffrently from other animals!
}

public class Dog extends Animal implements Pet {    
    public void play() {
       // MUST implemt play() details           
    }
}

Le chameau et le chien sont tous deux des animaux, donc ils s'étendent Animal classe. Mais seul le chien est un type spécifique de Animal que également peut être un Pet .

Comme vous le voyez, ce fil est fermé parce qu'il est basé sur des opinions et qu'il n'y a pas de réponse exacte. C'est un choix de conception qui dépend de la situation et des besoins du projet. vous avez les deux options disponibles, maintenant vous pouvez décider quel est le meilleur choix. par exemple la classe de chien ne doit pas toujours être comme dans l'exemple ci-dessus, si le projet est tout au sujet des différents types de chiens (et pas d'autres animaux) et même leur différence de sommeil et d'alimentation est importante ! il peut être comme ceci :

// the main contract
public interface Dog {
   public void eat();
   public void sleep();
} 

// Contract
public interface Pet {
    public void play(); 
} 

// Contract
public interface Hunter {
    public void hunt();
}

public class FamilyDogs implements Dog, Pet {
    // must implement all details
} 

public class GuardDogs implements Dog, Hunter {    
    // must implement all details
}

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