web-dev-qa-db-fra.com

Quand mettre en œuvre et étendre?

  • Quand faut-il utiliser implement ou extend?
  • Quels sont quelques exemples concrets?

Est-ce correct?

Implémentation semble être un moyen d'imposer que certaines méthodes existent dans une classe et que ces appels de fonction de méthodes sont correctement formatés. L'implémentation est pas un moyen de transmettre des variables ou des "paramètres" à la classe?

Scénario réel attendu: J'ai une plateforme de commerce électronique comprenant 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 de interface pour s'assurer que tous les bits et morceaux sont là, dès le début.

Extension classes fait que la classe étendue (enfant?) Hérite de tout de sa classe parente sauf les méthodes et 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, héritent ensemble 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.

79
Industrial

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 factoriser dans une classe de base et demander à chacune des classes enfants d'étendre 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 voudrez peut-être exiger que des 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 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 à implémenter par ces classes liées.

L'héritage est un grand concept dans OOP qui va bien au-delà de PHP. Je vous recommande de lire l'article wikipedia sur l'héritage et peut-être Design Patterns by the Gang de quatre .

Je crois que votre compréhension de l'héritage est principalement correcte. La prochaine étape serait de l'utiliser en production.

58
Rafe Kettler

Implémenter:

Les interfaces sont des classes abstraites, vous ne pouvez donc que déclarer des choses. Implémenter, c'est implémenter une interface! Vous pouvez implémenter des interfaces multiples.

Étendre:

Vous étendez les classes quand vous voulez une version plus spécifique d'une classe.

Exemple:

abstract class Animal {
    private String name;

    public void eat();
    public void sleep();
}

public interface Pet {
    public void play();
}

public class Dog extends Animal implements Pet {
    public void eat() {
        // do stuff
    }

    public void sleep() {
        // do stuff
    }

    public void play() {
        // do stuff
    }
}

public class Hippo extends Animal {
    public void eat() {
        // do stuff
    }

    public void sleep() {
        // do stuff
    }
}

Hippo et Dog sont tous deux des animaux, car ils sont tous les deux des animaux. Mais seul le chien peut être un animal de compagnie!

4
Ahmad Mobaraki