Héritage

Classes mères et classes filles en Java

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

L'un d'autres principes de la programmation orientée objet (OOP) est l'héritage. En Java il ne se différencie pas énormémement de celui en PHP.

L'héritage en OOP ne diffère pas beaucoup de l'héritage génétique. Dans les deux cas on a une "mère" qui transmet des "attributs" à un ou plusieurs de ses filles. Cependant, jamais tous ces attributs sont identiques. Parfois par exemple la mère peut être blonde tandis que son enfant brun. En même temps elle peut manger avec la main droite tandis que sa fille avec la main gauche. L'héritage en OOP repose sur le même principe. Une classe "mère" délègue à une ou plusieurs classes "filles" les attributs et les méthodes. Cependant, la classe fille peut modifier la logique de ces méthodes :
- totalement eee: code totalement différent
- partiellement : exécution de la méthode du parent et ensuite un traitement supplémentaire, spécifique à la fille

Regardons cette spécificité sur un exemple mère - fille :

public class Inheritance {
    public static void main(String[] args) {
        Child childNoHand = new Child("#1");
        childNoHand.eat();
        Child childWithHand = new Child("#2");
        childWithHand.setHand("left");
        childWithHand.eat();
    }
}

class Mother {
    protected String name;
    protected String hand;

    protected void eat() {
        if (hand.equals("left")) {
            System.out.println(name + " : Move fork to left side");
        }
        System.out.println(name + " : Start to eat");
    }
}

class Child extends Mother {
    public Child(String n) {
        name = n;
      }
  
    protected void setHand(String h) {
        hand = h;
    }

    protected void eat() {
        if (hand == null) {
          System.out.println(name + " : before continue, please give the hand name");
        } else {
          super.eat();
        }
    }
}

Voici le résultat :

#1 : before continue, please give the hand name
#2 : Move fork to left side
#2 : Start to eat

On voit clairement l'exemple d'une méthode eat() qui hérite partiellement de la mère.

Deux types d'héritage existent en Java :
- is-a : repose sur l'un des mots-clés extends ou implements et veut dire qu'une classe est une autre. Si l'on se réfère à l'exemple ci-dessus, on peut le traduire en "la classe Child est une sous-classe de la classe Mother".
- has-a : ressemble à une injection des dépendances. Une classe n'hérite pas d'une autre classe directement mais via une méthode. L'objet hérité est alors réduit à un attribut de la classe héritante. On pourrait comprendre cela grâce à cet exemple :

public class InheritanceHasA {
    public static void main(String[] args) {
        Child child = new Child("#1");
        child.eat();
        child.setHand("left");
        child.setMother(new Mother("#M1", child.getHand()));
        child.eat();
    }
}

class Mother {
    protected String name;
    protected String hand;
  
    public Mother(String n, String h) {
        name = n;
        hand = h;
    }
  
    protected void eat() {
        if (hand.equals("left")) {
            System.out.println(name + " : Move fork to left side");
        }
        System.out.println(name + " : Start to eat");
    }
}

class Child {
    protected String name;
    protected String hand;
    protected Mother mother;
  
    public Child(String n) {
        name = n;
    }
  
    public void setMother(Mother m) {
        mother = m;
    }
  
    public void setHand(String h) {
        hand = h;
    }
  
    public String getHand() {
        return hand;
    }
  
    public void eat() {
        if (hand == null) {
            System.out.println(name + " : before continue, please give the hand name");
        } else {
            mother.eat();
        }
    }
}

Voici le résultat :

#1 : before continue, please give the hand name
#M1 : Move fork to left side
#M1 : Start to eat

On peut donc dire que la classe Child a une relation avec la classe Mother grâce à l'attribut protégé de cette prémière classe, mother.

Une question ? Une remarque ?

*

*

Moi

Développeur d'applications Internet et journaliste passionné par l'adjectif français. Un aigle polonais orienté vers la progression, volant très haut et écoutant du zouk après les matches du foot français.

Vous appréciez mon travail ?

Pour contribuer au développement de ce site, ou pour remercier pour des articles rédigés, vous pouvez faire un don.

Un conseil Symfony1

Comment appeler un helper dans l'action ?

L'une des méthodes pour utiliser un view helper dans l'action est: sfProjectConfiguration::getActive()->loadHelpers(array("mon_helper")); mon_helper();